Branch resolve-check, tree clean. Suite 219/219; fixpoint
OK (3,714,376 bytes); corpus 372 OK / 0 crash.
Sum over T (s : T; s := s + n^.val) was 211 at template parse:
an unbound formal is an unresolved alias, and ClassOf maps such an
alias to ClPtr (the opaque-type rule), so ArithCheck saw a non-numeric
operand.
Fix: an unbound type formal already Resolves to InvalidType; the
expression checks simply weren't consulting Resolve. ArithCheck,
RelCheck, BoolCheck, OrdCheck, InCheck and EqCheck now skip on
Resolve(x) = InvalidType (instead of only x = InvalidType), which is
exactly what Assignable already did. So a formal — and, consistently,
any unresolved type — is treated as unknown and checks are skipped;
instances (where the formal is bound to the actual) are checked normally.
A formal typed by an inline PROCEDURE(...) tripped a false 235
("implementation does not match definition"): each parse builds a fresh
proc type, so the def's and impl's proc type have different TypeIndex
and the signature snapshot compared them by index.
Fix: FormalOk now compares two FProc formals structurally
(same result and parameter types, via ProcTypesOk) — the same
treatment open-array formals already had (fresh descriptors never share
an index).
Verifying #2 surfaced a third bug: f := Visitor.Add (an imported
proc, assigned to a proc-typed variable) stored 0 — LowerProcAddr
looked the name up in the proc table under the qualified/alias key.
Fix: fall back to SymTab.SymBase(nm) (the base symbol) before
giving up. (t_importproc.)
showcase23lib gained Sum (arithmetic over T) and
ForEach(visit : PROCEDURE(VAR acc : INTEGER; v : T); …) (a procedure
parameter), and the program passes the imported Visitor.Add:
list: 5 10 20
sum=35 (Sum over T)
foreach=35 (ForEach + imported visitor procedure)
reversed: 20 10 5
Files: showcase23lib.def/.mod, showcase23int.def/.mod,
showcase23vis.def/.mod, showcase23.mod.
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