MODULE TRetRec; (* Composite function results: a record/array result, a record result passed as a value argument, and a field of a call result. Exit 42. *) VAR ExitCode, got : INTEGER; TYPE Rec = RECORD a, b : INTEGER END; Arr = ARRAY [0..3] OF INTEGER; VAR r : Rec; a : Arr; PROCEDURE MkRec (x : INTEGER) : Rec; VAR q : Rec; BEGIN q.a := x; q.b := x + 1; RETURN q END MkRec; PROCEDURE MkArr (x : INTEGER) : Arr; VAR q : Arr; i : CARDINAL; BEGIN i := 0; WHILE i < 4 DO q[i] := x + i; INC(i) END; RETURN q END MkArr; PROCEDURE Sum (q : Rec) : INTEGER; BEGIN RETURN q.a + q.b END Sum; BEGIN got := 0; IF Sum(MkRec(20)) = 41 THEN INC(got) END; r := MkRec(10); IF (r.a = 10) AND (r.b = 11) THEN INC(got) END; a := MkArr(5); IF (a[0] = 5) AND (a[3] = 8) THEN INC(got) END; IF MkRec(7).b = 8 THEN INC(got) END; IF got = 4 THEN ExitCode := 42 ELSE ExitCode := got END END TRetRec.