MODULE TPtrChain; (* Regression: self-referential record fields must lay out the pointer and the following scalar at distinct offsets, and chained designators (p^.next^.value) plus VAR field actuals must load/store the right address. This is the lazyunique pointer-chain root cause. *) TYPE List = POINTER TO RECORD next : List; value: INTEGER; END; VAR ExitCode : INTEGER; VAR head, p : List; PROCEDURE Add (VAR q : List; val : INTEGER); BEGIN NEW(q); q^.value := val; q^.next := NIL END Add; BEGIN NEW(head); head^.value := -1; head^.next := NIL; p := head; Add(p^.next, 2); IF (p^.next # NIL) AND (p^.next^.value = 2) THEN p^.next^.value := 7; IF p^.next^.value = 7 THEN ExitCode := 42 ELSE ExitCode := 1 END ELSE ExitCode := 2 END END TPtrChain.