selfhost/cmd/wcc/check: flatten tagged spreads + iserror on tinfo.params (#61a)
A.6.3 #61 prerequisite (additive, no consumer changes). The tagged-variant machinery (taggedvariantindex / flatvariant* / cgwidentagremap / cgmatch) is AST-keyed -- it walks N_TTAGGED.list and spread-flattens `...inner` at read time. To migrate it onto tinfo.params (#61b/c) the chain must first carry the flattened variant set + per-variant error mark, matching cstage's Type.params / Type.iserror. tinfofornode's TTAGGED arm now splices `...inner` tagged spreads into ti.params (dealias one NAMED level, require TY_TAGGED, inline its already- flattened variants in declaration order) -- mirror of cstage check.c:366-389. Each variant gets an iserror flag via varianterr (TBANG / `!`-aliased). size/align stay accounted off the surface member so ti.size is byte-identical to before; the flatten + iserror have zero readers this commit (the lone TY_TAGGED params reader, nullableptrtag, only fires on 2-variant nullable unions with no spreads). iserror rides the shared tparam struct rather than a sidecar: a cstage-mirror divergence from harec, which carries no per-variant flag (models `!T` as a STORAGE_ERROR type node, ref/harec/include/types.h:144, src/types.c:151-159). Faithful port filed as #62. Spread-only flatten (cstage check.c:373 also flattens non-spread anonymous-nested unions) is a known symmetry gap, inert in bootstrap, tracked for #61b. make test 133/133 (quiescent tree, byte-id 990-997 green).
This commit is contained in:
@@ -71,6 +71,15 @@ type tfield = struct {
|
||||
type tparam = struct {
|
||||
name: str,
|
||||
type_: *tinfo,
|
||||
// #61a: per-variant `!T` error mark for TY_TAGGED variants.
|
||||
// cstage-MIRROR divergence: harec carries no per-variant flag —
|
||||
// it models `!T` as a distinct STORAGE_ERROR type node
|
||||
// (ref/harec/include/types.h:144, src/types.c:151-159
|
||||
// type_is_error). wwstage tinfo has no iserror field
|
||||
// (check.ww TTAGGED arm), so the bit rides the shared param
|
||||
// struct instead, matching cstage Type.iserror semantics.
|
||||
// Faithful STORAGE_ERROR-node port filed as #62.
|
||||
iserror: bool,
|
||||
tnext: *tparam,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user