This answers "where are we now?".
compiler/run_tests.sh).tools/v3-corpus/corpus.sh over the gm2 testsuite); the rest are
genuine language gaps or unresolved imports.resolve-check; tree clean.per unit:
Parse -> AST + declarations; each procedure body is skipped and
re-parsed at unit end, so forward references bind normally
Lower -> walk the AST, emit QBE (the only emitter)
Emit -> buffered image, EndModule
FwdVar*, Design's forward branch).
A module body may now call a procedure declared later; a nested-local
forward is a plain 201. -notwophase restores the legacy inline
parse for debugging.Check module was deleted once it was
proven vestigial (gutting it left the emitted .ssa byte-identical):
binding is late by construction.Lower is the only emitter; the AST is the interface.Program modules; CONST/VAR/TYPE (scalars, subranges, enums,
arrays, records incl. variants, sets, pointers); WITH/IN; whole
array/record copy; NEW/DISPOSE; full expressions and control flow;
GOTO/labels; procedures (value/VAR params, functions, recursion,
FORWARD, nested procedures, procedure values); Clarion-form CLASS
(methods, single inheritance, virtual dispatch); PIM coroutines;
Unicode (UCHAR/UString, UTF-8 edges); ISO type conversions T(x);
separate compilation (FROM/IMPORT, qualified L.x, opaque types);
generics (ISO 10514-2 refinement): type/value/procedure
parameters, constraints, nested generics, generic classes.
Lower (L0–L7) — Lower emits the whole session from the AST.Check deleted.T(x) (incl. CONST folding): corpus 365 → 372.M2 exit codes (0 ok / 1 errors / 2 usage-IO).PopPos wiping repass diagnostics; global record data
size (w 0 → l 0 for pointer/LONGINT/proc fields); template
arithmetic over a type formal; proc-typed formals in DEF/IMPL;
imported procedures used as values.showcase23 (generic doubly linked list).LANG buckets are not supported
yet, undeclared identifier, invalid call; separate genuine gaps
from missing stdlib imports (LIB), then fix the top bounded one.
See docs/analysis_gaps.md.ASTDUMP from M2.atg breaks the fixpoint" has never been
root-caused. A real correctness landmine.docs/wip/).docs/summary_*.md (see
docs/INDEX.md); decide on merging/pushing resolve-check.cd compiler
./build.sh # M2.atg -> scanner/parser/driver -> ./M2
./run_tests.sh # 219/219
cd ..
./bootstrap/fixpoint.sh # FIXPOINT OK (byte-identical stage2/stage3)