# Step: V3 compiler corpus run (gm2 testsuite) Tag `v3-corpus-run`. V3 suite **151/151**, fixpoint OK (unchanged — this only adds a harness and a doc). ## Why 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). ## Baseline (after the crash fix) | | 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. ## Fix: long-line buffer overflow (the 7 "set crashes") 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`, and - `GetLine` 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). ## Top remaining LANG gaps (from the corpus) - **48 `not supported yet`** — deliberate V3 `230`s; 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. - **Anchored subranges** `INTEGER [-1 .. 24]` (`array2`, `array3`) — PIM form V3's `Subrange` does not parse (`';' expected` at `[`). - **Unnamed parameters in procedure types** (`PROCEDURE (VAR ARRAY OF REAL)` in `another.mod`) — PIM allows them; V3 requires a name (`ident expected`). - Assorted: `incompatible assignment`/`comparison` on char arrays, `invalid ArrayType`, `invalid call`, `FOR … BY`, etc. ## Reproduce ```sh cd tools/v3-corpus ./corpus.sh # -> 219 compile-OK / 0 CRASH / 187 LIB / 206 LANG ``` ## Suggested next steps 1. **`SYSTEM` facilities**: expose at least `BYTE` / `WORD` / `SHORTADDR` etc. so `FROM SYSTEM IMPORT …` works. 2. **Anchored subranges** `T[lo..hi]` (small grammar addition). 3. **Unnamed proc-type parameters** (small grammar addition). 4. **Array constructors** `array{…}` (bigger: codegen). ## Files `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.