#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %begin
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
// 2 %routine do fn(%integerfn fred(%integer i))
void DOFN(int (*FRED)(int I)) {
// 3 %integer x
int X;
// 4 x = fred(1)
X = FRED(1);
// 5 %end
return;
} /* end of DOFN */
// 6 %routine do proc(%routine fred(%integer i))
void DOPROC(void (*FRED)(int I)) {
// 7 fred(1)
FRED(1);
// 8 %end
return;
} /* end of DOPROC */
// 9 %routine do map(%integermap fred(%integer i))
void DOMAP(int *(*FRED)(int I)) {
// 10 fred(1) = 1
*FRED(1) = 1;
// 11 %end
return;
} /* end of DOMAP */
// 12 %routine do pred(%predicate fred(%integer i))
void DOPRED(int (*FRED)(int I)) {
// 13 %return %if fred(1)
if (!(FRED(1))) goto L_0001;
return;
L_0001:;
// 14 %end
return;
} /* end of DOPRED */
// 15
// 16 %integerfn fn fred(%integer i)
int FNFRED(int I) {
// 17 %result = i
return I;
// 18 %end
} /* end of FNFRED */
// 19
// 20 %routine proc fred(%integer i)
void PROCFRED(int I) {
// 21 %end
return;
} /* end of PROCFRED */
// ?I unused
// 22
// 23 %integermap map fred(%integer i)
int *MAPFRED(int I)
{
// 24 %owninteger j
static int J;
// 25 %result == j
return /*?*/ &J;
// 26 %end
} /* end of MAPFRED */
// ?I unused
// 27
// 28 %predicate pred fred(%integer i)
int PREDFRED(int I) {
// 29 %true %if i&1 = 0
if (I & 1 != 0) goto L_0002;
return 1 /*TRUE*/;
L_0002:;
// 30 %false
return 0 /*FALSE*/;
// 31 %end
} /* end of PREDFRED */
// 32
// 33 %endofprogram
_imp_stop(0);
return 0;
end_0:;
}