#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(%short h0,%byte b2,b3)

  struct RF {
    union {
      struct {
        short int H0;
        unsigned char B2;
        unsigned char B3;
      };
    };
  };

  //     3  %ownrecord(rf) x1,x2

  static struct RF X1;
  static struct RF X2;

  //     4  %integerfn fred

  int FRED(void) {
    //     5  %integer k

    int K;

    //     6  %record(rf)r0,r1,r2

    struct RF R0;
    struct RF R1;
    struct RF R2;

    //     7  k=13

    K = 13;

    //     8  r0_h0=12

    R0.H0 = 12;

    //     9  x1_h0=17

    X1.H0 = 17;

    //    10  x2=x1

    X2 = X1;

    //    11  r1=r0

    R1 = R0;

    //    12  r2=r1

    R2 = R1;

    //    13  %result=r2_h0

    return R2.H0;

    //    14  %end

  } /* end of FRED */

  //    15  %if fred=12 %and x2_H0=17 %then printstring("Test OK")

  if (FRED() != 12) goto L_0001;
  if (X2.H0 != 17) goto L_0001;
  _imp_PRINTSTRING(_imp_str_literal("Test OK"));
L_0001:;

//    16  %endofprogram

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