009c4b35e286b4b98307ee27d8623342307c1359
Port cstage's match_yield_type walker (cmd/wcc/check.c:110-135) as `matchyieldtype` (Plan-9-cased) — recursive arm-body walker that finds the first reachable yield's operand type, descends N_BLOCK / N_IF / N_FOR / N_FORRANGE, and stops at nested N_MATCH (each match opens its own yield scope). Sole structural divergence from cstage: where cstage reads `body->lhs->type`, wwstage calls `exprtype(c, body.lhs, nil)` — wwstage's AST is untyped at parse time and the type lives in the tinfocache; exprtype is the canonical reader (tinfocache-idempotent per L467). Port cstage's N_MATCH match-as-expression stamp (check.c:1316- 1330) into a new exprtype arm. Walks the first non-nil arm yield via matchyieldtype, defaults to void if no arm yields. Closes the consumer half of the match-as-expression contract that A.6.2.0f opened on the producer side (N_YIELD). One documented divergence from cstage (lenient, intentional): the arm-yield-unification check (cstage L1322-1327) is skipped. That's a checker-correctness concern; this arm only stamps. Cstage's `match_yield_type` IS a helper there too — porting it is structural fidelity per rule 10, not a new helper invention under rule 9. β scope per Drew (2026-05-21): α (stamp void unconditionally) would bury a latent miscompile that A.6.2.1 assertion can't catch (it sees nil, not wrong). Hare's `match_expr` AST has no type field (ref/hare/hare/ast/expr.ha:341-348); harec/cstage unify arms at check time — same architecture wwstage mirrors. A.6.2 step 7 of 8 (γ order). The assertion closer (#15) is next, which lands the invariant on a green tree. `make test-unit` green; full `make test` batched per option B.
Description
No description provided
Languages
C
89.4%
Python
7.2%
Makefile
2.3%
Shell
0.8%
Assembly
0.3%