#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %begin
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
// 2 %recordformat fredfm (%integer a, %real b, %integer c)
struct FREDFM {
union {
struct {
int A;
float B;
int C;
};
};
};
// 3 %record (fredfm) fred = 0
struct FREDFM FRED;
FRED = (struct FREDFM){0};
// 4 ! NOT ALLOWED: %record (fredfm) %name fredp == 0
// 5 ! NOT ALLOWED: %record (fredfm) %name fredp = 0
// 6 %record (fredfm) %name fredp == RECORD(0)
struct FREDFM *FREDP;
FREDP = (struct FREDFM *)_imp_RECORD(0);
// 7
// 8 %on %event * %start
if (!_imp_on_event(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)) goto L_0001;
// 9 ! does not trap SIGSEGV !
// 10 write(event_event,0); newline
_imp_WRITE(_imp_EVENT().EVENT, 0);
_imp_NEWLINE();
// 11 %stop
_imp_stop(0);
// 12 %finish
L_0001:;
// 13
// 14 fred_a = 1; fred_b = 1.1; fred_c = 1
FRED.A = 1;
FRED.B = 1.1;
FRED.C = 1;
// 15 write(fred_a,0); write(fred_c,3); newline
_imp_WRITE(FRED.A, 0);
_imp_WRITE(FRED.C, 3);
_imp_NEWLINE();
// 16 fred = 0
FRED = (struct FREDFM){0};
// 17 write(fred_a,0); write(fred_c,3); newline
_imp_WRITE(FRED.A, 0);
_imp_WRITE(FRED.C, 3);
_imp_NEWLINE();
// 18
// 19 fredp == fred
FREDP = (struct FREDFM *)/*?*/ &FRED;
// 20 fred_a = 1; fred_b = 1.1; fred_c = 1
FRED.A = 1;
FRED.B = 1.1;
FRED.C = 1;
// 21 write(fredp_a,0); write(fredp_c,3); newline
_imp_WRITE(FREDP->A, 0);
_imp_WRITE(FREDP->C, 3);
_imp_NEWLINE();
// 22
// 23 fredp = 0
*FREDP = (struct FREDFM){0};
// 24 write(fred_a,0); write(fred_c,3); newline
_imp_WRITE(FRED.A, 0);
_imp_WRITE(FRED.C, 3);
_imp_NEWLINE();
// 25
// 26 ! NOT ALLOWED: fredp == 0
// 27 fredp == RECORD(0)
FREDP = (struct FREDFM *)_imp_RECORD(0);
// 28 !write(fredp_a,0); write(fredp_c,3); newline ;! "Segmentation fault" as expected
// 29 %endofprogram
_imp_stop(0);
return 0;
end_0:;
}