Преглед изворни кода

docs: two-phase thread complete + Check removed (2026-10-16)

Eric Streit пре 16 часа
родитељ
комит
2421c4de52
1 измењених фајлова са 80 додато и 0 уклоњено
  1. 80 0
      docs/summary_two-phase-complete-2026-10-16.md

+ 80 - 0
docs/summary_two-phase-complete-2026-10-16.md

@@ -0,0 +1,80 @@
+# Session summary — 2026-10-16 (b): two-phase thread complete, `Check` removed
+
+Branch **`resolve-check`**, HEAD `a89a1c0`, tree clean.  Suite
+**201/201**; fixpoint **OK (3,555,791 bytes)**.
+
+Tags added this session: `v3-two-phase-m2a`, `m2b`, `m2c`,
+`m2-summary`, `v3-two-phase-flip`, `v3-forward-machinery-deleted`,
+`v3-two-phase-m2d-summary`, `v3-check-removed`.
+
+## What this session did
+
+1. **Landed milestone 2c** — real deferral + re-parse (behind
+   `-twophase` then flipped on by default).  Two bugs found and fixed:
+   the re-parse loop clobbered the unit's `astDecl`/`astStmt`, and
+   `PopPos` restored `errors`, wiping every diagnostic from repassed
+   bodies.  Details in `docs/summary_two-phase-m2-2026-10-16.md`.
+2. **Pinned + fixed the spurious `ident expected`** (a `DeferSkip`
+   snapshot leak: `PushPos` without `PopPos` on the success path, fixed
+   with `scanner.DropPos`) and **flipped deferral on by default**
+   (`-notwophase` restores the old inline parse).
+3. **Deleted the forward-reference machinery** — the thread's original
+   goal: `SymTab.FwdVarRef`/`FwdVarName`/`FwdVarResolve` (+ tables),
+   `Check.NoteForward`/`FlushForward`, the `Design` forward branch, the
+   dead `Check.SelType`/`LeafName`.  New semantics: a module-level body
+   may call a procedure declared later (no `FORWARD`); a nested-local
+   forward is a plain `201` instead of a broken image.  (Nested
+   deferral was tried and reverted — it regressed nested-proc codegen.)
+4. **Removed `Check` entirely** after proving it vestigial: gutting
+   `Resolve` left the `.ssa` byte-identical across all 141 suite files
+   and emitted no diagnostics.  Deleted `Check.def`/`Check.mod`, its
+   driver calls, the `-noresolve` option, and the atg import; dropped
+   `build.sh`'s `Check`.  Also removed the unused `procNest` and the
+   always-true L7 flag `twoPhase`.
+
+## Architecture now
+
+```
+per unit:
+  Parse   -> AST + declarations (procedure bodies are skipped and
+             re-parsed at unit end, so forward references bind normally)
+  Lower   -> walk the AST, emit QBE (unchanged)
+  Emit    -> buffered image, EndModule
+```
+
+No separate resolve/check pass: binding is late by construction.
+`compiler/src` is `M2.atg` (grammar+scanner+parser+driver frames),
+`FileIO`, `AST`, `SymTab`, `QbeGen`, `Lower`.
+
+## Verification
+
+- Suite **201/201** (`t_fwdproc -> 7`, `t_bad_nestfwd` `201`);
+  `twophase_same` gate compares the default (deferral) against
+  `-notwophase` for forward-free files; forward tests run to 42.
+- **Fixpoint OK with deferral on** — the self-hosted compiler
+  self-compiles byte-identically under the deferral.
+- Corpus (612 gm2 testsuite files): **365 OK vs 358** with
+  `-notwophase` — **+7 files, 0 regressions, 0 crashes**.
+- `.ssa` byte-identical to pre-cleanup on spot-checks and the 141-file
+  set.
+
+## Next
+
+1. **Generics: multi-formal instantiation link bug** (top — a real
+   in-scope defect): `GENERIC … M(T,U)` + `X = M(INTEGER,CHAR)`
+   compiles but fails to link (`undefined First_4`; the `.ssa` has the
+   call but no body).  Repro in `docs/summary_generics-2026-10-15.md`.
+2. Generics increment 3 (const/proc params, constraints), `GENERIC
+   CLASS`, instance dedup.
+3. stdlib gaps; robustness (`M2` exit codes, weak recovery); the
+   latent size-sensitive V3 miscompile.
+
+## Resume
+
+```sh
+cd .../m2compiler-V3
+git checkout resolve-check          # HEAD a89a1c0
+cd compiler && ./build.sh && ./run_tests.sh   # 201/201
+cd .. && ./bootstrap/fixpoint.sh    # FIXPOINT OK
+./M2 -notwophase tests/foo.mod       # legacy inline parse (debug)
+```