| 12345678910111213141516171819202122232425262728293031323334353637 |
- 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.
|