#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  !%permroutinespec    write(%integer  v,p);
//     2  !%permroutinespec    newline
//     3
//     4  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     5    %routine fancy9(%integer %array (2) %name param)

  void FANCY9(int *PARAM) {
    //     6    %end

    return;
  } /* end of FANCY9 */

  // ?PARAM unused
  //     7
  //     8    %integer %array       ia0(2:3)

  int IA0[2];
  struct _imp_dv IA0_dv = {IA0, sizeof(int) /*, dims, <bounds> */};

  //     9    %integer %array       ia1(2:3,1:2)

  int IA1[2][2];
  struct _imp_dv IA1_dv = {IA1, sizeof(int) /*, dims, <bounds> */};

  //    10    %integer %array       ia2(1:2,1:3)

  int IA2[2][3];
  struct _imp_dv IA2_dv = {IA2, sizeof(int) /*, dims, <bounds> */};

  //    11
  //    12    %integer %array     %name ian0

  int *IAN0;
  struct _imp_dv IAN0_dv = {0};  // assignment of an array to an arrayname must copy bounds info too...

  //    13    %integer %array (2) %name ian1

  int *IAN1;
  struct _imp_dv IAN1_dv = {0};  // assignment of an array to an arrayname must copy bounds info too...

  //    14
  //    15    ia1(2,1) = 221; ia1(3,1) = 331

  IA1[0][0] = 221;
  IA1[1][0] = 331;

  //    16    ia1(2,2) = 10;  ia1(3,2) = 20

  IA1[0][1] = 10;
  IA1[1][1] = 20;

  //    17
  //    18    ia2(1,1) = 8221;  ia2(2,1) = 9331

  IA2[0][0] = 8221;
  IA2[1][0] = 9331;

  //    19    ia2(1,2) = 8010;  ia2(2,2) = 9020

  IA2[0][1] = 8010;
  IA2[1][1] = 9020;

  //    20    ia2(1,3) = 8333;  ia2(2,3) = 9333

  IA2[0][2] = 8333;
  IA2[1][2] = 9333;

  //    21
  //    22    ian1 == ia1

  IAN1 = (int *)IA1;

  //    23    write(ian1(2,1),0)

  _imp_WRITE(IAN1[/*BUG*/ 1], 0);

  //    24    newline

  _imp_NEWLINE();

  //    25
  //    26    fancy9(ian1)

  FANCY9(IAN1);

  //    27
  //    28    ian1 == ia2

  IAN1 = (int *)IA2;

  //    29    write(ian1(2,1),0)

  _imp_WRITE(IAN1[/*BUG*/ 1], 0);

  //    30    newline

  _imp_NEWLINE();

  //    31
  //    32    ian0 == ia0

  IAN0 = (int *)IA0;

  //    33
  //    34    !fancy9(ia0) not allowed
  //    35
  //    36    fancy9(ia1)

  FANCY9(IA1);

  //    37    fancy9(ian1)

  FANCY9(IAN1);

  //    38
  //    39  %endofprogram

  _imp_stop(0);
  return 0;
end_0:;
}