Pārlūkot izejas kodu

docs: DList showcase + generics limitation fixes summary (2026-10-16)

Eric Streit 14 stundas atpakaļ
vecāks
revīzija
4b2810ffe9
1 mainītis faili ar 65 papildinājumiem un 0 dzēšanām
  1. 65 0
      docs/summary_dlist-showcase-2026-10-16.md

+ 65 - 0
docs/summary_dlist-showcase-2026-10-16.md

@@ -0,0 +1,65 @@
+# Session summary — DList showcase and generics limitation fixes (2026-10-16)
+
+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`.
+
+## The showcase
+
+`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"`.
+
+## Bug fixed — global record data size (general)
+
+`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`.
+
+## Limitations fixed (`65f331e`)
+
+1. **Arithmetic/relations over a type formal** — the expression checks
+   (`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.)
+2. **Proc-typed formals in a DEF/IMPL pair** — `FormalOk` compares two
+   `FProc` formals structurally (`ProcTypesOk`), like open arrays,
+   instead of by `TypeIndex`.  No more false `235`.
+3. **Imported procedure used as a value** — `LowerProcAddr` falls back
+   to `SymTab.SymBase(nm)`, so `f := Visitor.Add` resolves to the code
+   address (was `0`).  (`t_importproc`.)
+
+## Verify
+
+```sh
+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
+```
+
+## Standing generics status
+
+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`.