#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

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

  //     2    %integer i

  int I;

  //     3    %integerarray ia1(3:5)

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

  //     4    %integerarrayname ian1

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

  //     5    %integerarray ia2(2:4,3:6)

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

  //     6    %integerarray(2)%name ian2

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

  //     7
  //     8    ia1(3) = i

  IA1[0] = I;

  //     9    i = ia1(3)

  I = IA1[0];

  //    10
  //    11    ia2(2,3) = i

  IA2[0][0] = I;

  //    12    i = ia2(2,3)

  I = IA2[0][0];

  //    13
  //    14    ian1 == ia1

  IAN1 = (int *)IA1;

  //    15    ian1(3) = i

  IAN1[/*BUG*/ 3] = I;

  //    16    i = ian1(3)

  I = IAN1[/*BUG*/ 3];

  //    17
  //    18    ian2 == ia2

  IAN2 = (int *)IA2;

  //    19    ian2(2,3) = i

  IAN2[/*BUG*/ 3] = I;

  //    20    i = ian2(2,3)

  I = IAN2[/*BUG*/ 3];

  //    21
  //    22  %endofprogram

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