#include <perms.h>

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

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

  //     2    %comment %begin
  //     3    %recordformat rf ( %integer i, %real r, %integer i2)

  struct RF {
    union {
      struct {
        int I;
        float R;
        int I2;
      };
    };
  };

  //     4    %comment   %recordformat rf ( %integer i, %real r, %integer i2)
  //     5
  //     6    %comment
  //     7    %record (rf) rec1, rec2

  struct RF REC1;
  struct RF REC2;

  //     8    %comment   %record (rf) rec1, rec2
  //     9
  //    10    %record (rf) %name %array recna1(2:3)

  struct RF *RECNA1[2];

  //    11    %comment   %record (rf) %name %array recna1(2:3)
  //    12
  //    13    %record (rf) %name %array %name recnan1

  struct RF **RECNAN1;

  //    14    %comment   %record (rf) %name %array %name recnan1
  //    15
  //    16    %comment
  //    17
  //    18    ! SETUP
  //    19
  //    20    rec1 = rec2

  REC1 = REC2;

  //    21    %comment   rec1 = rec2
  //    22
  //    23    recnan1 == recna1

  RECNAN1 = (struct RF *)RECNA1;

  //    24    %comment   recnan1 == recna1
  //    25
  //    26    ! TEST
  //    27
  //    28    recnan1(2) == rec1

  [/*BUG*/ 0] = (struct RF *)/*?*/ &REC1;

  //    29    %comment   recnan1(2) == rec1   ... the (2) is missing
  //    30
  //    31    rec2 = recnan1(2)

  REC2 = *[/*BUG*/ 0];

  //    32    %comment   rec2 = recnan1(2)   ... the (2) is missing
  //    33
  //    34    %comment
  //    35    %comment %endofprogram
  //    36  %endofprogram

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