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:
2026-06-09 21:27:40 +09:00
parent 5c28c90837
commit 758d3ec8c3
6 changed files with 395 additions and 76 deletions

View File

@@ -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 },
};