Tag v3-corpus-run. V3 suite 155/155, fixpoint OK.
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 and fixes what it finds.
Harness: tools/v3-corpus/corpus.sh — compiles each file with
compiler/M2 in a scratch tree, together with its sibling DEFINITION
and the DEFINITION of every module it imports ($V3_LIBS search path),
and splits failures into CRASH / LIB (unresolved import) / LANG (real
gap).
1. gm2 testsuite (gm2/pim/pass + gm2/iso/run/pass, 612 files):
| no libs | with $V3_LIBS |
|
|---|---|---|
| compile-OK | 242 | 277 |
| CRASH | 0 | 0 |
| LIB | 185 | 9 |
| LANG | 185 | 326 |
2. gm2 standard libraries (m2pim/m2iso/m2log/m2cor/m2min,
336 files):
| no libs | with $V3_LIBS |
|
|---|---|---|
| compile-OK | 78 | 115 |
| LIB | 176 | 0 |
| LANG | 82 | 221 |
(With the import path set, LIB noise is gone and the true LANG counts are visible.)
v3-fix-longline-crash) — GetLine
wrote past a 256-byte listing buffer; a long line (an 860-char enum)
overflowed the stack. Fixed (GetLine truncates, buffer 4096,
bounded caret loop); CRASH → 0.EXPORT QUALIFIED in DEFINITION modules (v3-export-qualified).SYSTEM facilities — predefine BYTE/SBYTE/WORD/SWORD/
LONGWORD/SHORTADDR/LONGADDR/PROC/LOC (mapped onto V3's
integer family / ADDRESS) so FROM SYSTEM IMPORT BYTE; and
ARRAY OF BYTE resolve.T[lo..hi] (INTEGER [-1 .. 24]).PROCEDURE (VAR ARRAY OF
REAL)) plus open arrays in procedure types and structural
proc-type formal compatibility (ParamTypesOk), so assigning a
procedure with an open-array parameter to a procedure variable works.corpus.sh now finds and passes the
.def of each imported module ($V3_LIBS), removing the LIB noise.T{…} (GNU Modula-2). A CONST whose value
is a constructor (my = arr {'h','e','l','l','o'}, arr {1,2,3,4 BY
3}, nested names { "Thu", "Fri" }) now lowers to a pooled static
descriptor (data $ctoN = { l len, … }) with the same layout as a
declared array, and the constant resolves to its address; whole-array
copy, indexing and LEN then work unchanged. Elements: scalars
(b/w/d/l by class), nested constructors, string literals for
nested ARRAY OF CHAR, and the expr BY n repeat form. New
QbeGen.Ctor{Begin,Elem,ElemStr,End}; the old TypedSetLit became
the unified TypedBraceLit (BITSET{…} still a set).ARRAY <ordinalType> OF T (index-type arrays, e.g.
ARRAY btype OF INTEGER in array2/array3) — V3 only has
ARRAY [lo..hi] OF / ARRAY OF. The big one.undeclared identifier — SYSTEM facilities beyond the set
above, and small library holes.PROCEDURE __BUILTIN__ name(…), C-name
pragmas, ISO module attributes (not V3's dialect; skip).not supported yet — deliberate 230s (records in
constructors, non-numeric BY, …).cd tools/v3-corpus
./corpus.sh # testsuite, no libs
G=$HOME/bin/Modula2/Gm2/lib/gcc/x86_64-pc-linux-gnu/16.0.1/m2
V3_LIBS="$G/m2pim:$G/m2iso:$G/m2log:$G/m2cor:$G/m2min" ./corpus.sh
V3_LIBS="$G/m2pim:$G/m2iso:$G/m2log:$G/m2cor:$G/m2min" \
./corpus.sh "$G/m2pim" "$G/m2iso" "$G/m2log" "$G/m2cor" "$G/m2min"
ARRAY <type> OF T (index-type arrays) — a real PIM feature.SYSTEM facilities / library holes.CONST
expressions (runtime element values).tools/v3-corpus/{corpus.sh,README.md}, compiler/src/compiler.frm
(long-line), compiler/src/M2.atg (EXPORT QUALIFIED, anchored
subranges, unnamed proc-type params, TypedBraceLit array
constructors), compiler/src/SymTab.def/.mod (SYSTEM predefs,
ParamTypesOk), compiler/src/QbeGen.def/.mod
(CtorBegin/CtorElem/CtorElemStr/CtorEnd, FlushCtors),
compiler/tests/t_ctor{1,2,3}.mod, compiler/tests/t_longline.mod,
compiler/run_tests.sh, this doc.