summary_generics-2026-10-15.md 2.1 KB

Generics status — 2026-10-15

Branch resolve-check (contains v3-generics-inc2, 19 commits back). Design: docs/analysis_generics.md; inc2 record: docs/summary_generics-inc2.md. Suite 196/196, incl. GenericProg (single-formal Ident(INTEGER), exit 42).

What works

ISO 10514-2 form: GENERIC DEFINITION/IMPLEMENTATION MODULE M(T : TYPE) plus refinement DEFINITION MODULE X = M(actual). A refinement instantiates by re-parsing the generic's source with the formals bound to the actuals (SymTab.EnterTypeParamBound, Reenter; driver registry maps generic name → file; the abstract template is never emitted). Re-verified live: FROM IntId IMPORT Id; Id(42) → exit 42.

Fresh finding: multiple formals parse but do not link

Probed 2026-10-15 (not in the suite):

GENERIC DEFINITION MODULE Pair (T : TYPE; U : TYPE);
PROCEDURE First(x : T; y : U) : T; ...
DEFINITION MODULE IntChar = Pair(INTEGER, CHAR); ...

Compiles (Parsed correctly) but fails at link: undefined First_4. The emitted .ssa references First_4 once (call site) and defines no such function — the implementation unit's instantiation drops (or misnames) the body when there is more than one formal. The inc2 doc says multiple formals are "threaded but only a single T is exercised": threading covers parse, not emit. Repro files (throwaway, not committed): /tmp/opencode/g2*.mod.

Still open (unchanged from inc2)

  • Fix multi-formal instantiation (bug in shipped scope — sensible first step before new features).
  • Increment 3: const/procedure parameters, constraints.
  • GENERIC CLASS; generics with a program module.
  • Instance dedup (each refinement re-instantiates today).
  • Ordering rule stands: refinement file after the generic's file, generic def before its impl.

Resume

cd .../m2compiler-V3/compiler
./M2 tests/g_ident.def tests/g_ident.mod tests/g_intid.def \
  tests/g_intid.mod tests/g_prog.mod   # GenericProg session

Multi-formal repro: rebuild /tmp/opencode/g2*.mod per §"Fresh finding" above, then qbe + cc to observe the link failure.