#include <perms.h>

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

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

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

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

  //     3    %record (rf) rec1, rec2

  struct RF REC1;
  struct RF REC2;

  //     4    %own %record (rf) %name %array recna1(2:3) ;! cannot be initialised

  static struct RF *RECNA1[2];
  struct _imp_dv RECNA1_dv = {RECNA1, sizeof(struct RF *) /*, dims, <bounds> */};

  //     5    %record (rf) %name %array %name recnan1

  struct RF **RECNAN1;
  struct _imp_dv RECNAN1_dv = {0};  // assignment of an array to an arrayname must copy bounds info too...

  //     6
  //     7    rec1 = rec2

  REC1 = REC2;

  //     8    recnan1 == recna1           ;! I think this should translate to RECNAN1 = RECNA1 not RECNAN1 = &RECNA1 as it currently does

  RECNAN1 = (struct RF *)RECNA1;

  //     9
  //    10  %control 3

  // _imp_control(0x0003); /* %control is a compiler directive and does not generate code. */

  //    11    recnan1(2) == rec1

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

  //    12    rec2 = recnan1(2)

  REC2 = *RECNAN1[/*BUG*/ 2];

  //    13  %control 0

  // _imp_control(0x0000); /* %control is a compiler directive and does not generate code. */

  //    14
  //    15  %endofprogram

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