Tag v3-corpus-run. V3 suite 151/151, fixpoint OK (unchanged —
this only adds a harness and a doc).
The TopSpeed corpus validated the sidecar grammar, not V3 the
compiler (the sidecar is a separate TSM2 binary built from
TopSpeed-V3-M2.atg; it reuses V3's SymTab/QbeGen/FileIO sources
but never runs compiler/M2). So this step runs V3 itself over a
real standard-Modula-2 corpus: the gm2 testsuite
testsuite/gm2/pim/pass and testsuite/gm2/iso/run/pass.
Harness: tools/v3-corpus/corpus.sh (copies each file to a scratch
tree, compiles alone, splits failures into CRASH / LIB / LANG — see its
README).
| files | |
|---|---|
| total | 612 |
| compile-OK (0 errors) | 219 |
| CRASH (M2 died, rc ≥ 128) | 0 |
| LIB (imports a gm2 library V3 lacks) | 187 |
| LANG (real V3 gap) | 206 |
(Before the fix: 219 OK / 7 CRASH / 182 LIB / 204 LANG.) So ~187
of the 393 failures are simply missing gm2 libraries (StrIO,
NumberIO, STextIO, SWholeIO, FpuIO, WholeStr, StdIO,
M2RTS, DynamicStrings, Processes, …) — expected, not language
gaps. The signal is the 206 LANG files.
The 7 crashes (largeset, program2, set9, sets3,
smallset4/5/6) were not set bugs: those files contain a ~860-char
line (a 76-literal enumeration), and
PrintListing's line buffer was ARRAY [0 .. 255] OF CHAR, andGetLine wrote without bounding to HIGH(line).A source line longer than 255 chars therefore overflowed the stack
(corrupting locals and the return address) — hence the garbage line
number in the .LST and the segfault.
Fixed in compiler/src/compiler.frm:
GetLine now truncates at HIGH(line) (still consuming the rest of
the line so positions stay correct);PrintListing's buffer is now ARRAY [0 .. 4095] OF CHAR;PrintErr's caret loop is bounded by HIGH(line).Regression test: compiler/tests/t_longline.mod (406-char line, exit
0). Suite 152/152; fixpoint OK (2,339,115 bytes).
not supported yet — deliberate V3 230s; the corpus shows
which constructs matter, e.g. array constructors
(array {'h','e','l','l','o'} in arrayconst1).undeclared identifier — mostly SYSTEM facilities V3 does
not expose (FROM SYSTEM IMPORT BYTE; → BYTE), plus small library
holes.INTEGER [-1 .. 24] (array2, array3) —
PIM form V3's Subrange does not parse (';' expected at [).PROCEDURE (VAR ARRAY OF REAL) in another.mod) — PIM allows
them; V3 requires a name (ident expected).incompatible assignment/comparison on char arrays,
invalid ArrayType, invalid call, FOR … BY, etc.cd tools/v3-corpus
./corpus.sh # -> 219 compile-OK / 0 CRASH / 187 LIB / 206 LANG
SYSTEM facilities: expose at least BYTE / WORD /
SHORTADDR etc. so FROM SYSTEM IMPORT … works.T[lo..hi] (small grammar addition).array{…} (bigger: codegen).tools/v3-corpus/{corpus.sh,README.md},
compiler/src/compiler.frm (long-line fix),
compiler/tests/t_longline.mod, compiler/run_tests.sh, this doc.