MODULE TNestArr; (* Regression: a RECORD field that is a nested ARRAY OF ARRAY OF CHAR, accessed as `arr[i].field[j][k]`, must not segfault. Exit 42. (Was docs/wip/nested-array-field-bug.mod.) *) VAR ExitCode : INTEGER; CONST MaxName = 63; MaxProc = 4; TYPE PE = RECORD name : ARRAY [0..MaxName] OF CHAR; npar : CARDINAL; pname : ARRAY [0..3] OF ARRAY [0..MaxName] OF CHAR; (* nested *) END; VAR procs : ARRAY [0..MaxProc-1] OF PE; nProcs : CARDINAL; PROCEDURE Reset; BEGIN nProcs := 0 END Reset; PROCEDURE NoteProc (name : ARRAY OF CHAR); VAR i : CARDINAL; BEGIN IF nProcs >= MaxProc THEN RETURN END; i := 0; WHILE (i < MaxName) AND (name[i] # CHR(0)) DO procs[nProcs].name[i] := name[i]; INC(i) END; procs[nProcs].name[i] := CHR(0); procs[nProcs].npar := 0; INC(nProcs) END NoteProc; PROCEDURE NoteParam (name : ARRAY OF CHAR); VAR j, i : CARDINAL; BEGIN IF nProcs = 0 THEN RETURN END; j := procs[nProcs-1].npar; i := 0; WHILE (i < MaxName) AND (name[i] # CHR(0)) DO procs[nProcs-1].pname[j][i] := name[i]; INC(i) END; procs[nProcs-1].pname[j][i] := CHR(0); procs[nProcs-1].npar := j + 1 END NoteParam; BEGIN Reset; NoteProc("Add"); NoteParam("a"); IF (nProcs = 1) AND (procs[0].pname[0][0] = "a") THEN ExitCode := 42 ELSE ExitCode := 1 END END TNestArr.