triage-corpus-2026-10-24.md 3.9 KB

Corpus triage — 2026-10-24

State after this pass: suite 301/301, fixpoint OK 3,573,487 bytes, corpus 521/612 compile-OK, 0 crashes, 64 LANG, 27 LIB.

The corpus is compile-only. This pass separated the remaining LANG failures into policy, dialect/lexical choices, implementation limits, and genuine language/library gaps. It also fixed one small genuine ISO/gm2 builtin.


Fixed in this pass

  • LFLOAT(x) (testfloat4): accepted as the ISO/gm2 integer/LONGREAL conversion. V3 represents all reals as 64-bit, so it shares the FLOAT implementation (VAL(REAL, x)). Regression: t_lfloat.

testfloat4 now compiles; corpus 518 → 519.


Declaration-order policy (decl-order)

These are not language gaps. V3 deliberately enforces PIM/ISO declaration-before-use for data. The files use a module variable, constant, type or nested-module export before its declaration (often to match gm2’s multi-pass behavior).

  • adrunbounded3, arrayptr, arrayptr6, block, blockindirect, nestedfor, param3, proc;
  • complextypes, colour;
  • constprocedure, conststrarray, constvec3;
  • constructor1, constructor3;
  • record7, record14.def, record15.def, record16.def;
  • subrange4, subrange7, subrange11;
  • setconst3, setoverflow, sets2, smallset2, stressset, largeset1, largeset2, tinyset6, tinyset7;
  • onebyte, onebyte2, onebyte3;
  • except2, except4, except5, except7, except8, except9;
  • shift3, shift4;
  • unbounded5, unbounded6, unbounded7, unbounded8.

adraddress also contains a genuine ADDRESS/pointer comparison gap, but its r reference before declaration means it remains a declaration-order case under policy.

No policy relaxation is recommended.


Lexical / dialect choices (not planned as language changes)

  • No octal B suffix: arrayindirect (666B).
  • No H numeric suffix: wordconst (012H).
  • Inline ASM: fooasm3 (not in the V3 scope).
  • Address arithmetic: divaddr, modaddr, multaddr, pointer (ADDRESS DIV/MOD/* and pointer arithmetic; gm2 extensions).
  • CHAR arithmetic: timeio2 (CHAR - CHAR; not standard).
  • Structural array/type leniency: another (assigning distinct but structurally identical array types).
  • SHORTREAL vs WORD VAR: testparam3 (gm2 word-model extension; V3 has 64-bit reals).
  • Absolute variables VAR [addr]: T: now supported at module level; the gm2 corpus uses the 1000H suffix, so those cases still need a literal-form update or scanner support.
  • Module named CHAR: CHAR.mod collides with the predefined type; gm2-specific test naming.

Implementation limits

  • settest1, settest3: fixed by bounded wide sets plus the dynamic sorted-range representation for SET OF CARDINAL (corpus 519 → 521).
  • largeset5: set ordering (<, >=); PIM/ISO only defines =/#/IN for sets, so this is a gm2 extension rather than a missing standard operation.

Library / foreign-module cases

  • badpointer: requires gm2 DynamicStrings/opaque String behavior; the module is not part of V3’s shipped library set. Classified as a library/extension case, not a parser/codegen gap.

Genuine gaps worth considering later

  • ADDRESS ↔ pointer comparison: fixed for equality (t_addreq); adraddress remains a declaration-order corpus case.
  • Absolute variables and inline ASM remain unimplemented extensions; neither is part of the current PIM/ISO target.
  • Wide sets remain an explicit implementation limit; raising it is a separate design task.

No other genuine standard-language gap was found in the current LANG set.


Recommendation

Proceed with separate compilation/library folders as the next major feature. Corpus policy and dialect categories should stay documented rather than being “fixed” by relaxing V3.