# Step: V3 compiler corpus runs Tag `v3-corpus-run`. V3 suite **152/152**, fixpoint OK. ## 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 work runs **V3 itself** over two real Modula-2 corpora. Harness: `tools/v3-corpus/corpus.sh` — compiles each file with `compiler/M2` alone (pairing an IMPLEMENTATION with its sibling DEFINITION), in a scratch tree, and splits failures into CRASH (M2 died) / LIB (imports a module outside V3's known stdlib) / LANG (real gap). ## Corpora and results **1. gm2 testsuite** — `testsuite/gm2/pim/pass` + `iso/run/pass` (612 files): | | files | | --- | --- | | **compile-OK** | **242** | | CRASH | 0 | | LIB (missing gm2 library) | 185 | | LANG (real V3 gap) | 185 | **2. gm2 standard libraries** — `$HOME/bin/Modula2/Gm2/lib/gcc/…/m2/` (`m2pim`/`m2iso`/`m2log`/`m2cor`/`m2min`, 336 files, `.def`+`.mod`): | | files | | --- | --- | | **compile-OK** | **78** | | CRASH | 0 | | LIB | 176 | | LANG | 82 | (LIB is high in both because each file is compiled alone — cross-module imports are not resolved; the real signal is LANG.) ## Fixes landed ### A. Long-line buffer overflow (the 7 "set" crashes) — `v3-fix-longline-crash` `PrintListing`'s line buffer was `ARRAY [0 .. 255]` and `GetLine` wrote without bounding to `HIGH(line)`, so a source line > 255 chars (an 860-char enum line in the gm2 set tests) overflowed the stack. Fixed in `compiler/src/compiler.frm` (truncate in `GetLine`, buffer → 4096, bounded caret loop); regression `t_longline.mod`; CRASH → 0. ### B. `EXPORT QUALIFIED` in DEFINITION modules — this step gm2/PIM definition modules carry an export list (`EXPORT QUALIFIED ReadString, WriteString, …;`). V3's `DefUnit` did not accept it → `'END' expected` on the first such file. Added the clause (parsed; the names are already exported by the module scope). This raised **both** corpora: testsuite compile-OK **219 → 242**, gm2 libs **42 → 78**. ## Remaining LANG gaps - Tests suite: **185** files, mostly gm2-specific libraries' call sites and deliberate V3 `230`s (array constructors, …). - gm2 libs: **82** files, dominated by **gm2-specific syntax** — `PROCEDURE __BUILTIN__ name(...)` (`Builtins`/`libc`/`libm`/…), C-name pragmas, ISO module attributes — which are *not* V3's dialect. - Genuine V3 gaps still seen: **`SYSTEM` facilities** (`FROM SYSTEM IMPORT BYTE`), **anchored subranges** `T[lo..hi]`, **unnamed procedure-type parameters**. ## Reproduce ```sh cd tools/v3-corpus ./corpus.sh # gm2 testsuite -> 242 OK / 185 LANG G=$HOME/bin/Modula2/Gm2/lib/gcc/x86_64-pc-linux-gnu/16.0.1/m2 ./corpus.sh $G/m2pim $G/m2iso $G/m2log $G/m2cor $G/m2min # 78 OK ``` ## Suggested next steps 1. **`SYSTEM` facilities**: expose `BYTE`/`WORD`/`SHORTADDR` etc. 2. **Anchored subranges** `T[lo..hi]` (small grammar addition). 3. **Unnamed proc-type parameters** (small grammar addition). 4. Resolve cross-module imports in the harness (pass each file's imported `.def`s) to remove the LIB noise and isolate LANG. ## Files `tools/v3-corpus/{corpus.sh,README.md}`, `compiler/src/compiler.frm` (long-line fix), `compiler/src/M2.atg` (`EXPORT QUALIFIED`), `compiler/tests/t_longline.mod`, `compiler/run_tests.sh`, this doc.