#include <perms.h>

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

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

  //     2
  //     3    %begin

  { /*%begin*/

    //     4      %recordformat OUT OF SCOPE(%integer P, Q)

    struct OUTOFSCOPE {
      union {
        struct {
          int P;
          int Q;
        };
      };
    };

    //     5    %end

    goto end_1000;
  end_1000:;
  }

  // ?OUTOFSCOPE unused
  //     6
  //     7    %recordformatspec RECFM
  //     8
  //     9    %record (RECFM) %name REC NAME

  struct OUTOFSCOPE *RECNAME;

  //    10
  //    11    %record (RECFM) %name %array REC NAME ARRAY(0:9)

  struct OUTOFSCOPE *RECNAMEARRAY[10];

  //    12
  //    13    %record (RECFM) %map REC MAP

  struct OUTOFSCOPE *RECMAP(void)
  {

    //    14      %result == REC NAME

    return RECNAME;

    //    15    %end

  } /* end of RECMAP */

  //    16
  //    17    %recordformat DERIVED (%c

  struct DERIVED {
    union {
      struct {
        int I;
        struct OUTOFSCOPE *LINK;
      };
    };
  };

  //    18+     %integer I,
  //    19+     %record (REC FM) %name LINK)
  //    20
  //    21    %record %format RECFM (%real R)

  struct RECFM {
    union {
      struct {
        float R;
      };
    };
  };

  //    22
  //    23    %record (RECFM) ACTUAL

  struct RECFM ACTUAL;

  //    24
  //    25    REC NAME == ACTUAL

  RECNAME = (struct OUTOFSCOPE *)/*?*/ &ACTUAL;

  //    26
  //    27    REC NAME_R = 3.14

  RECNAME->R = 3.14;

  //    28
  //    29  %endofprogram

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