t_nestarr.mod 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. MODULE TNestArr;
  2. (* Regression: a RECORD field that is a nested ARRAY OF ARRAY OF CHAR,
  3. accessed as `arr[i].field[j][k]`, must not segfault. Exit 42.
  4. (Was docs/wip/nested-array-field-bug.mod.) *)
  5. VAR ExitCode : INTEGER;
  6. CONST MaxName = 63; MaxProc = 4;
  7. TYPE PE = RECORD
  8. name : ARRAY [0..MaxName] OF CHAR;
  9. npar : CARDINAL;
  10. pname : ARRAY [0..3] OF ARRAY [0..MaxName] OF CHAR; (* nested *)
  11. END;
  12. VAR procs : ARRAY [0..MaxProc-1] OF PE;
  13. nProcs : CARDINAL;
  14. PROCEDURE Reset;
  15. BEGIN nProcs := 0 END Reset;
  16. PROCEDURE NoteProc (name : ARRAY OF CHAR);
  17. VAR i : CARDINAL;
  18. BEGIN
  19. IF nProcs >= MaxProc THEN RETURN END;
  20. i := 0;
  21. WHILE (i < MaxName) AND (name[i] # CHR(0)) DO
  22. procs[nProcs].name[i] := name[i]; INC(i)
  23. END;
  24. procs[nProcs].name[i] := CHR(0);
  25. procs[nProcs].npar := 0; INC(nProcs)
  26. END NoteProc;
  27. PROCEDURE NoteParam (name : ARRAY OF CHAR);
  28. VAR j, i : CARDINAL;
  29. BEGIN
  30. IF nProcs = 0 THEN RETURN END;
  31. j := procs[nProcs-1].npar;
  32. i := 0;
  33. WHILE (i < MaxName) AND (name[i] # CHR(0)) DO
  34. procs[nProcs-1].pname[j][i] := name[i]; INC(i)
  35. END;
  36. procs[nProcs-1].pname[j][i] := CHR(0);
  37. procs[nProcs-1].npar := j + 1
  38. END NoteParam;
  39. BEGIN
  40. Reset; NoteProc("Add"); NoteParam("a");
  41. IF (nProcs = 1) AND (procs[0].pname[0][0] = "a")
  42. THEN ExitCode := 42 ELSE ExitCode := 1 END
  43. END TNestArr.