summary_v3-corpus.md 3.4 KB

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 230s (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

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 .defs) 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.