wcc/check: #14 nominal typeeqast (aliassym) closes A6 cross-module variant identity (wwstage)
typeeqast's N_TNAME arm compared variant types by SURFACE string (streq(aa.str, bb.str)), so a cross-module type referenced bare (oserror) vs qualified (os.oserror) mis-compared unequal -> A6: concrete->tagged silently mis-identified the variant. Resolve each name to its canonical type sym before comparing: keep the streq fast-path, else aliassym(c,aa)==aliassym(c,bb) (ww's existing resolver maps bare [#53] and qualified [#51] to the same SK_TYPE sym). AST analog of cstage type.c:278 TY_NAMED a==b / harec types.c:579 ident_equal -- NO interning. `c` threaded into 21 typeeqast sites. B-full Layer 1: closes A6/#14; Layer 2 (A7 tagged->tagged subset reject) stays deferred to the #199b flatten arc. Byte-id-neutral; graduates shlex #59.15 (989 M_WWREJECT->M_ID). test/wcc/839 pins both-stage symmetry (discriminating teeth = 989 #59.15, per 839 doc).
This commit is contained in:
@@ -157,8 +157,11 @@ static const struct ent ents[] = {
|
||||
.mode = M_WWREJECT, .cite = "#59.13" },
|
||||
{ .fixture = "lib/fnmatch/fnmatchtest.ww",
|
||||
.mode = M_WWREJECT, .cite = "#59.14" },
|
||||
/* #59.15 shlex graduated to M_ID by B-full Layer 1 (#14 nominal
|
||||
* typeeqast): the cross-module bare-vs-qualified variant forward
|
||||
* w6c_ww over-rejected now compiles byte-identically. */
|
||||
{ .fixture = "lib/shlex/shlextest.ww",
|
||||
.mode = M_WWREJECT, .cite = "#59.15" },
|
||||
.mode = M_ID, .cite = "#59.15 graduated by #14 nominal typeeqast" },
|
||||
{ .fixture = NULL },
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user