cstage+test: SK_USE→SK_X promotion sets use_alias
In cmd/wcc/check.c the pass-1.5 SK_USE→SK_DEF/SK_FN/SK_VAR promotion sites forgot to set prev->use_alias = 1 when the imported module's top-level decl shadowed the SK_USE leaf in flat scope. Downstream dot-prefixed lookups (resolve_typename L77, N_DOT L709) gate the module-head walk on (SK_USE || use_alias), so `mod.flag` resolution fell through to "unknown type". The SK_TYPE precedent at L1660 had the line; the three sister sites at L1709/L1722/L1736 now do too, in the same one-line shape and field-set order. The wwstage selfhost/cmd/wcc/check.ww uses coexistence rather than in-place promotion: SK_USE and same-leaf SK_TYPE/FN/DEF/VAR live as separate entries differentiated by sym.mod, and scopelookupinmodule's mod-filter already disambiguates dotted lookups — no use_alias flag needed, so the cstage bug is structurally non-reachable there. An architectural note at installdecl documents this divergence-by-design and warns against porting the flag (adding a field to `sym` changes its size and risks the wwstage cgen amalloc-undersize trap). Audit covered every SK_USE→SK_X promotion path in check.c (4 sites: SK_TYPE already-correct as precedent, SK_DEF/SK_FN/SK_VAR fixed). The surfacing case was lib/fnmatch: `fn fnmatch(...)` shadows the SK_USE leaf, so `fnmatch.flag` failed in worker-fnmatch's WIP — that test (972_fnmatch_run) now flips PASS as live integration proof. test/wcc/699_use_promote_alias.c pins all four rows with a single table-driven driver (type/fn/def/var → use mod; let m: mod.flag = mod.flag.A; return m: i32, expecting exit 42 per row). 995_self_rebuild byte-identity holds.
This commit is contained in:
@@ -94,6 +94,20 @@ fn declmod(file: *node, d: *node) str = {
|
||||
// installdecl — install the top-level decl's name into the top scope.
|
||||
// We don't compute its type yet (that's the resolve pass) — just bind
|
||||
// the name so forward references resolve.
|
||||
//
|
||||
// Architectural note: wwstage uses COEXISTENCE rather than the cstage
|
||||
// promote-SK_USE-in-place approach in cmd/wcc/check.c. SK_USE and any
|
||||
// same-leaf SK_TYPE/SK_FN/SK_DEF/SK_VAR live as separate entries in
|
||||
// the same scope-bucket, distinguished by `sym.mod`. The dot-prefix
|
||||
// lookup in resolvewalk + scopelookupinmodule's mod-filter already
|
||||
// disambiguate `fnmatch.flag` against an `fn fnmatch(...)` of the same
|
||||
// leaf — no `use_alias` flag needed. So the cstage L1722-class bug
|
||||
// (promotion missing use_alias) is structurally non-reachable here.
|
||||
// Don't port the use_alias flag from cstage without first re-reading
|
||||
// the architecture: adding a field to `sym` changes its size and risks
|
||||
// the wwstage cgen amalloc-undersize trap (rob-pike). #11 (wwstage
|
||||
// checkfile pass) will reconsider this when wwstage grows a real check
|
||||
// pass on the cgen path.
|
||||
fn installdecl(c: *checker, file: *node, d: *node) void = {
|
||||
if (d == nil) { return; };
|
||||
let k: nkind = d.kind;
|
||||
|
||||
Reference in New Issue
Block a user