MODULE m; TYPE PR = POINTER TO R; R = RECORD i: INTEGER; byte: BYTE; a: ARRAY 3 OF INTEGER; p: POINTER TO R END; VAR i: INTEGER; byte: BYTE; b: BOOLEAN; a: ARRAY 5 OF INTEGER; byteArray: ARRAY 3 OF BYTE; PROCEDURE p1(VAR i1, i2: INTEGER; VAR byte: BYTE); BEGIN i1 := 1; i2 := 2; byte := 3; END p1; PROCEDURE p2(i: INTEGER; byte: BYTE; b: BOOLEAN); END p2; PROCEDURE index(VAR i: INTEGER): INTEGER; RETURN i END index; PROCEDURE indexByte(VAR b: BYTE): BYTE; RETURN b END indexByte; PROCEDURE array(VAR a: ARRAY OF INTEGER): INTEGER; RETURN a[0] END array; PROCEDURE p3(VAR i: INTEGER; VAR byte: BYTE; VAR b: BOOLEAN); VAR j: INTEGER; r: R; ar: ARRAY 5 OF R; ai: ARRAY 5 OF INTEGER; BEGIN j := i + 1; j := 2 * i; j := i DIV 2; j := -i; b := ~b; a[i] := i; p1(j, i, byte); p1(i, j, byte); p1(i, a[index(i)], byteArray[indexByte(byte)]); p2(i, byte, b); p1(r.i, ar[index(r.i)].i, ar[index(r.i)].byte); NEW(r.p); NEW(ar[j].p); p1(r.p.i, ar[j].p.i, ar[j].p.byte); p2(ar[j].p.i, ar[j].p.byte, r.p.i = ar[j].p.i); j := array(ai); j := array(r.a); END p3; PROCEDURE testPointerDereferenceAndPassAsVAR(p: PR); PROCEDURE innerVAR(VAR r: R); END innerVAR; PROCEDURE innerConstVAR(r: R); END innerConstVAR; BEGIN innerVAR(p^); innerConstVAR(p^); END testPointerDereferenceAndPassAsVAR; BEGIN p3(i, byte, b) END m.