Historical (2026-09-30). Current state: suite 184/184, FIXPOINT OK (3,392,601 bytes); there is now a full AST and a two-phase
Loweremitter (docs/STATUS.md). The list below is kept as the gap analysis from that date; several items have since landed (§7).
Suite 169/169, self-hosting fixpoint OK (2,754,353 bytes).
Corpus at this point (with $V3_LIBS):
| corpus | compile-OK | CRASH | LANG |
|---|---|---|---|
| gm2 testsuite (612) | 392 | 0 | 212 |
| gm2 stdlib (336) | 127 | 0 | 209 |
Failure taxonomy (testsuite, per file): undeclared identifier 65,
not supported yet 43, invalid call 25, incompatible assignment
25, ident expected 8, invalid ImpName 7.
FROM libc intrinsic — printf/exit/… import as permissive
external C procedures (varargs, no result) and bind to the C
symbols; string/CHAR-array actuals pass as descriptor+8. This
removed the dominant undeclared bucket (136 → 65 files).SET OF enum and SET OF <char-range> (plus enum subranges
[a..d], ARRAY [FALSE..TRUE]), and the set span limit lifted
256 → 65536.MIN/MAX for REAL/LONGREAL/LONGINT and gm2 sized names
(LONGCARD, SHORTREAL, INTEGER8/16/32/64, CARDINAL8/…).INCL/EXCL (statements) and
SHIFT/ROTATE (expressions), bit-by-bit over a runtime amount.Ranked by corpus impact (each verified by a failing file or a probe):
SET OF <enum> and
SET OF ['A'..'z'] are 230. Only bool/char/integer subrange
bases are accepted. (goodifin.mod, charset2.mod, enum3.mod.)MIN/MAX for REAL/LONGREAL/LONGINT — only ordinal types,
arrays and sets are handled; MAX(REAL) / MIN(LONGINT) are 230.
(maxreal.mod, minmaxreal2.mod, longmm.mod, constcast.mod.)LONGCARD, SHORTREAL, INTEGER8/16/32/64,
CARDINAL8/16/32/64, LONGWORD undeclared.SHIFT, INCL, EXCL, ROTATE, LOC,
sized-bit names (INCL/EXCL/SHIFT recur).[a..d],
ARRAY [FALSE..TRUE] … are 230.String — not a gm2 built-in: it is an opaque type imported
from a definition module (DynamicStrings, or a local opaque).
V3 now treats unresolved (opaque/forward) aliases as pointer-like,
which is the real fix.GOTO + labels — parse error.236.MODULE — parsed, not lowered.F()^.docs/analysis_generics.md).NEWPROCESS/TRANSFER/IOTRANSFER).docs/OOP.txt).DISPOSE (shallow today) and runtime/syslib/Trap
(traps are $abort, rc 134).Procedure types and indirect calls do work (t_proctype passes);
docs/features.md still lists them as ⏸ — stale.
String, StrIO, RealStr/WholeStr,
LongIO/LongMath/LongStr, the InOut/StdIO/STextIO/
SWholeIO/SIOResult family, IOConsts, Termination,
StdChans/StreamFile/FIO, SysStorage, wrapclock/time,
ChanConsts/GenDevIF/DeviceTablePtr (the gm2 device/IO framework).FROM libc IMPORT printf, exit — no intrinsic libc module;
this is the largest undeclared identifier bucket (163 + 141
occurrences) and is not a real language gap.Lower emits from it (docs/STATUS.md).
Declaration-before-use is still enforced by the grammar's semantic
pass, so forward references in CONST/expressions still fail (only
FORWARD procedures and ForwardType are tolerated).M2 exits 0 even with errors (harnesses parse
the .LST verdict) and aborts on a missing input file.ident
expected / 'END' expected.Classic identifiers (no _), # not <>, no octal B/C, 0x-only
hex, NOT/AND/OR only, TopSpeed legacy isolated in the sidecar.
FROM libc intrinsicSET OF enum + SET OF char-rangeMIN/MAX for REAL/LONGINT + gm2 sized typesINCL/EXCL/SHIFT/ROTATEAlso done: opaque/pointer-like types (incl. String), variant-record
assignment (flat blit), nested-MODULE lowering, ADDRESS↔pointer
assignment.
Remaining after today: GOTO/labels, generics, multiple inheritance
(deliberate), and the channel/device library holes in §2.
(Statement-context result suffixes F()^.x := e, composite function
results — record/array/set/class — and chained post-call method calls
F().M() all landed 2026-10-08.)
F()^, F()[i], F().field (expression
context). Statement-context suffix targets (F()[i] := x) and
chained post-call calls (F().M()) are still not accepted.PROCESS + NEWPROCESS/TRANSFER/IOTRANSFER
(ucontext-backed).ConvTypes, IOConsts, SIOResult,
TERMINATION, StrIO, InOut, StdIO, WholeStr, RealStr,
LongStr, LongMath, LongIO, STextIO, SWholeIO, SRealIO,
DynamicStrings (core), SysStorage.