|
|
@@ -269,4 +269,21 @@ Measured while scaffolding (branch `resolve-check`):
|
|
|
tree and then take over the statement/expression checks. Only then
|
|
|
can `Design` stop deferring and `FwdVar*` go.
|
|
|
|
|
|
+- **2026-10-15 (`9dc2ed7`, step 4c)** — resolved types now propagate up
|
|
|
+ the expression tree: `Check.PropNode` walks the unit post-order and
|
|
|
+ `EvalExpr` re-types any node still `-1`, combining its operands by the
|
|
|
+ operator rules (reusing `SymTab.ArithCheck`/`RelCheck`/`InCheck`/
|
|
|
+ `BoolCheck`). Leaf kinds must be skipped — their `child 0` is a text
|
|
|
+ index, not a node (descending into it segfaulted). First half of the
|
|
|
+ `Lower` split too: string and set literals now read the type the
|
|
|
+ parser stored instead of constructing a second one. Verified by the
|
|
|
+ differential instrument (compared by class); regression tests
|
|
|
+ `t_fwdsel.mod` and `t_fwdprop.mod`; suite 192/192.
|
|
|
+- **Remaining**: the *checks* themselves (assignment, control flow,
|
|
|
+ calls) are still parse-time and lenient for forwards, so `Design`
|
|
|
+ still defers; moving them into the walk is what finally lets
|
|
|
+ `FwdVar*` go. The instrument also exposed a pre-existing, harmless
|
|
|
+ divergence: a procedure value's type is `ClProc` at parse time but
|
|
|
+ `ClInvalid` in `Lower`.
|
|
|
+
|
|
|
|