#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    %record (rf) %name recn1, recn2

  struct RF *RECN1;
  struct RF *RECN2;

  //    10    %comment   %record (rf) %name recn1, recn2
  //    11    %record (rf) %array reca1,reca2(2:3),reca3(4:5,1:2)

  struct RF RECA1[2];
  struct RF RECA2[2];
  struct RF RECA3[2][2];

  //    12    %comment   %record (rf) %array reca1,reca2(2:3),reca3(4:5,1:2)
  //    13    %record (rf) %array %name recan1,recan2

  struct RF *RECAN1;
  struct RF *RECAN2;

  //    14    %comment   %record (rf) %array %name recan1,recan2
  //    15    %record (rf) %name %array recna1,recna2(2:3),recna3(1:2)

  struct RF *RECNA1[2];
  struct RF *RECNA2[2];
  struct RF *RECNA3[2];

  //    16    %comment   %record (rf) %name %array recna1,recna2(2:3),recna3(1:2)
  //    17    %record (rf) %name %array %name recnan1,recnan2

  struct RF **RECNAN1;
  struct RF **RECNAN2;

  //    18    %comment   %record (rf) %name %array %name recnan1,recnan2
  //    19    %record(rf)%fn rfn1

  struct RF RFN1(void) {
    //    20    %comment   %record(rf)%fn rfn1
    //    21      %result = rec2

    return REC2;

    //    22    %comment     %result = rec2
    //    23    %end

  } /* end of RFN1 */
  //    24    %comment   %end
  //    25    %record(rf)%map rmap1

  struct RF *
  RMAP1(void)
  {

    //    26    %comment   %record(rf)%map rmap1
    //    27      %result == rec2

    return /*?*/ &REC2;

    //    28    %comment     %result == rec2
    //    29    %end

  } /* end of RMAP1 */

  //    30    %comment   %end
  //    31
  //    32    %comment
  //    33    rec1 = rec2

  REC1 = REC2;

  //    34    %comment   rec1 = rec2
  //    35    recn1 == rec2

  RECN1 = (struct RF *)/*?*/ &REC2;

  //    36    %comment   recn1 == rec2
  //    37    rec1 = recn1

  REC1 = *RECN1;

  //    38    %comment   rec1 = recn1
  //    39    reca1(2) = rec2

  RECA1[0] = REC2;

  //    40    %comment   reca1(2) = rec2
  //    41    rec1 = reca1(2)

  REC1 = RECA1[0];

  //    42    %comment   rec1 = reca1(2)
  //    43    reca3(4,2) = rec2

  RECA3[0][1] = REC2;

  //    44    %comment   reca3(4,2) = rec2
  //    45    rec1 = reca3(4,2)

  REC1 = RECA3[0][1];

  //    46    %comment   rec1 = reca3(4,2)
  //    47    recnan1 == recna1

  RECNAN1 = (struct RF *)RECNA1;

  //    48    %comment   recnan1 == recna1
  //    49    recnan1(2) == rec1

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

  //    50    %comment   recnan1(2) == rec1
  //    51    rec1 = recnan1(2)

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

  //    52    %comment   rec1 = recnan1(2)
  //    53    rec1 = rfn1

  REC1 = RFN1();

  //    54    %comment   rec1 = rfn1
  //    55    rmap1 = rec1

  *RMAP1() = REC1;

  //    56    %comment   rmap1 = rec1
  //    57    rec1 = rmap1

  REC1 = *RMAP1();

  //    58    %comment   rec1 = rmap1
  //    59
  //    60    %comment
  //    61    %comment %endofprogram
  //    62  %endofprogram

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