9fed4ca492aaf51d4ab44b65fb73a37ae7d65430
isassignable's tagged-variant inclusion was resolvealias-unwrapping both src and each variant before typeeqast. Two NAMED structs (e.g. `(void | err)` with src=`err`) both flattened to N_TSTRUCT and typeeqast's conservative struct branch returned false — false positive on the assignability. Cstage variant_match (cmd/wcc/check.c:90-100) compares TY_NAMED pointer-identically, so the nominal name short-circuits before any body inspection. Mirror: try typeeqast on unwrapbang'd src vs unwrapbang'd variant first (catches the N_TNAME nominal match), fall through to resolvealias + structural compare for anonymous- union variants only. Reviewer's negative probe (different types modA.err vs modB.err with same leaf name) still correctly rejects — the parser joins pkg.alias into one TNAME string, so modA.err ≠ modB.err at the nominal level. Bare-vs-qualified residual (cstage admits `(void | M.err)` ← bare `err` inside module M; wwstage still rejects) tracked as #57. Not hit by any current fixture; unblocks #50 (after #56) and #42. 131/131 + 4 lines of pre-existing pessimism cleared in selfhost/cmd/wcc/check.ww's own resolution.
Description
No description provided
Languages
C
89.4%
Python
7.2%
Makefile
2.3%
Shell
0.8%
Assembly
0.3%