#include <perms.h>
// Edinburgh IMP77 Compiler - Version 8.4
//
// 1 %BEGIN
int main(int argc, char **argv) { /*%begin*/
_imp_initialise(argc, argv);
// 2 %INTEGER I,J
int I;
int J;
// 3 %OWNSTRING(15)FAILED="TEST OK"
static _imp_string15 FAILED = _imp_str_init("TEST OK");
// 4 %RECORDFORMAT F(%INTEGER I,J)
struct F {
union {
struct {
int I;
int J;
};
};
};
auto void INTERCHANGE(struct F * R, int P, int Q);
// 5 %ROUTINESPEC INTERCHANGE(%RECORD(F)%ARRAYNAME A,%INTEGER I,J)
// 6 %RECORD(F)%ARRAY A(0:3)
struct F A[4];
// 7 %RECORD(F)%ARRAY B(1:4)
struct F B[4];
// 8 %CYCLE I=0,1,3
// %for I = 0, 1, 3 %cycle
{
I = -1;
L_0001:
if (I == 3) goto L_0002;
I += 1;
// 9 A(I)_I=I
A[I].I = I;
// 10 B(I+1)_I=I+1
B[I + 1 - 1].I = I + 1;
// 11 %REPEAT
goto L_0001;
}
L_0002:;
// 12 INTERCHANGE(A,1,3)
INTERCHANGE(A, 1, 3);
// 13 Failed="***BUG FOUND" %UNLESS A(1)_I=3 %AND A(3)_I=1
if (A[1].I != 3) goto L_0003;
if (A[3].I == 1) goto L_0004;
L_0003:;
_imp_strncpy(/*?*/ &FAILED, ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("***BUG FOUND");
(void *)&tmp;
}),
/*max:*/ 15);
L_0004:;
// 14 INTERCHANGE(B,1,3)
INTERCHANGE(B, 1, 3);
// 15 Failed="***BUG FOUND" %UNLESS B(1)_I=3 %AND B(3)_I=1
if (B[0].I != 3) goto L_0005;
if (B[2].I == 1) goto L_0006;
L_0005:;
_imp_strncpy(/*?*/ &FAILED, ({
__typeof__(_imp_string255) tmp; /*B*/
tmp = _imp_str_literal("***BUG FOUND");
(void *)&tmp;
}),
/*max:*/ 15);
L_0006:;
// 16 printstring(failed)
_imp_PRINTSTRING(
*({
__typeof__(_imp_string15) tmp = FAILED /*q*/;
(_imp_string255 *)&tmp;
})
);
// 17 %ROUTINE INTERCHANGE(%RECORD(F)%ARRAYNAME R,%INTEGER P,Q)
void INTERCHANGE(struct F * R, int P, int Q) {
// 18 %RECORD(F) TEMP
struct F TEMP;
// 19 TEMP=R(P)
TEMP = [/*BUG*/ 0];
// 20 R(P)=R(Q)
[/*BUG*/ 0] = [/*BUG*/ 0];
// 21 R(Q)=TEMP
[/*BUG*/ 0] = TEMP;
// 22 %END
return;
} /* end of INTERCHANGE */
// 23 %ENDOFPROGRAM
_imp_stop(0);
return 0;
end_0:;
}