Branch resolve-check, tree clean. Suite 219/219; fixpoint
OK (3,714,376 bytes); corpus 372 OK / 0 crash.
Tags this arc: v3-showcase23, v3-generics-limitations-fixed.
showcase23 is a generic doubly linked list: DList (T : TYPE)
with Node/List records, Init/Append/Prepend/Count/Get/
Sum/Reverse/ForEach, instantiated as IntList = DList(INTEGER).
It exercises a type parameter, arithmetic over it (Sum), and a
procedure parameter (ForEach with an imported visitor):
list: 5 10 20
sum=35 (Sum over T)
foreach=35 (ForEach + imported visitor procedure)
reversed: 20 10 5
Files: showcase23lib.def/.mod (generic), showcase23int.def/.mod
(refinement), showcase23vis.def/.mod (the visitor), showcase23.mod
(the program). Wired as expect_run_files_out Showcase23 35 "list: 5 10 20".
QbeGen.RecItems emitted w 0 (4 bytes) for every scalar record
field, including pointers/LONGINT/proc (8 bytes), so a global of such
a record was under-sized and later globals clobbered its tail
(List.count read as 0). Now emits l 0 for
ClPtr/ClLong/ClProc. Regression t_recptr.
65f331e)ArithCheck/RelCheck/BoolCheck/OrdCheck/InCheck/EqCheck)
now skip on Resolve(x) = InvalidType (as Assignable already did),
so an unbound formal is unknown in the template and checked
normally once bound. (Sum over T works.)FormalOk compares two
FProc formals structurally (ProcTypesOk), like open arrays,
instead of by TypeIndex. No more false 235.LowerProcAddr falls back
to SymTab.SymBase(nm), so f := Visitor.Add resolves to the code
address (was 0). (t_importproc.)cd .../m2compiler-V3/compiler
./M2 ../stdlib/sysio.def ../stdlib/sysio.mod \
tests/showcase23lib.def tests/showcase23lib.mod \
tests/showcase23int.def tests/showcase23int.mod \
tests/showcase23vis.def tests/showcase23vis.mod tests/showcase23.mod
# -> list: 5 10 20 / sum=35 / foreach=35 / reversed: 20 10 5, exit 35
Type/value/procedure parameters, constraints
(ORDINAL/INTEGER/REAL/POINTER/SCALAR), nested generics, and
generic classes (via generic modules) all work; see
docs/summary_generics-closed-2026-10-16.md.