diff --git a/selfhost/cmd/w6c/main.combined.ww b/selfhost/cmd/w6c/main.combined.ww index 32c2820e..4eef3353 100644 --- a/selfhost/cmd/w6c/main.combined.ww +++ b/selfhost/cmd/w6c/main.combined.ww @@ -19202,9 +19202,20 @@ fn rhsstructpayload(c: *cgen, src: *node) str = { let tn: *node = lc.tnode; if (tn != nil) { if (tn.kind == nkind.N_TNAME) { - if (structlookup(c, tn.str) != nil) { - return tn.str; - }; + // #62 Layer-2 (F2 ww half): bare structlookup + // missed an alias name (ali->base), so the + // struct value fell to the SCALAR widen arm — + // word0-only box payload, words 1+ zero-filled + // (both-wrong-identical with cstage pre-F1, + // gate-blind). structlookupchain is the name- + // domain twin of cstage's su=type_chase_named + // (cg_widen_tagged_store, c138605); returning + // the REGISTERED name keeps every consumer's + // re-lookup hitting. The variant TAG still + // keys on the un-chased stamped type — the + // member's nominal identity is the alias. + let si: *structinfo = structlookupchain(c, tn); + if (si != nil) { return si.sname; }; }; }; }; @@ -19484,7 +19495,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // (cmd/w6c/cgen.c:1273). resolvetagged's N_TBANG unwrap is already // handled upstream by tinfofornode (check.ww:1203-1210). let dt: *tinfo = dst; - for (dt != nil && dt.kind == tykind.TY_NAMED) { dt = dt.under; }; + dt = tichase(dt); if (dt == nil) { return; }; if (dt.kind != tykind.TY_TAGGED) { return; }; // Nullable fold: one 8B word holding the pointer (or 0 for void). @@ -19539,9 +19550,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s if (castrhs != nil) { let castt: *tinfo = castrhs.type_: *tinfo; let castu: *tinfo = castt; - for (castu != nil && castu.kind == tykind.TY_NAMED) { - castu = castu.under; - }; + castu = tichase(castu); if (castu != nil) { if (castu == dt) { castisdst = true; @@ -19558,6 +19567,13 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s }; }; }; + // #62 Layer-2: ONE source-classify chase at entry (post cast peels, + // where src is final) — the per-arm single reads it replaces all + // chased the same src.type_. Mirrors cstage cg_widen_tagged_store's + // `su = type_chase_named(st)` position (c138605). Tag lookups keep + // the un-chased src.type_ (nominal identity is the alias). + let su: *tinfo = src.type_: *tinfo; + su = tichase(su); // #218: is the source itself a single NESTED variant of dt (its // whole tagged type matches one dt variant), rather than a flattened // SUBSET whose members spread into dt? If so, the inner tagged value @@ -19593,10 +19609,6 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s os.write(2, msg.ptr, msg.len: u64); os.exit(1); }; - let su: *tinfo = src.type_: *tinfo; - for (su != nil && su.kind == tykind.TY_NAMED) { - su = su.under; - }; let ssz: i32 = su.size: i32; emitline("\tXORQ\tAX, AX\n"); let zk: i32 = 0; @@ -19741,11 +19753,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // tag-remap — the mem-based twin of the ident arm above. // Mirrors cstage cg_widen_tagged_store's memread arm. if (taggedmemread(c, src)) { - let su37: *tinfo = src.type_: *tinfo; - for (su37 != nil && su37.kind == tykind.TY_NAMED) { - su37 = su37.under; - }; - let ssz37: i32 = su37.size: i32; + let ssz37: i32 = su.size: i32; cgexpr(c, src); let mk37: i32 = 0; for (mk37 < ssz37) { @@ -19798,12 +19806,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // cg_widen_tagged_store's generic-else bound. Surfaced by // reviewer-37's `let w = *p` probe on a 56B box: cstage loud, // wwstage silent (rule-10 break). - let sf37: *tinfo = src.type_: *tinfo; - for (sf37 != nil && sf37.kind == tykind.TY_NAMED) { - sf37 = sf37.under; - }; - if (sf37 != nil && sf37.kind == tykind.TY_TAGGED - && sf37.size: i32 > TUPLE_GPCAP * 8) { + if (su != nil && su.kind == tykind.TY_TAGGED + && su.size: i32 > TUPLE_GPCAP * 8) { let m37f: str = "#37: >32B tagged source of a non-mem-based kind unwired (rule 7)\n"; os.write(2, m37f.ptr, m37f.len: u64); os.exit(1); @@ -19812,8 +19816,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // taggedcastpeel (cast to a THIRD union) would fall to the // scalar arm below and silently truncate — loud. Mirrors // cstage's widen subset-arm cast bound. - if (src.kind == nkind.N_CAST && sf37 != nil - && sf37.kind == tykind.TY_TAGGED && sf37.nullable == 0) { + if (src.kind == nkind.N_CAST && su != nil + && su.kind == tykind.TY_TAGGED && su.nullable == 0) { let m35b: str = "#35: tagged cast source shape unwired at the widen subset arm (rule 7)\n"; os.write(2, m35b.ptr, m35b.len: u64); os.exit(1); @@ -19850,12 +19854,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // the word-copy / cursor-receive arms are wired. Mirrors // cstage cg_widen_tagged_store. if (tupsrc == nil) { - let stu72: *tinfo = src.type_: *tinfo; - for (stu72 != nil && stu72.kind == tykind.TY_NAMED) { - stu72 = stu72.under; - }; - if (stu72 != nil) { - if (stu72.kind == tykind.TY_TUPLE) { + if (su != nil) { + if (su.kind == tykind.TY_TUPLE) { let m72: str = "cgwidentaggedstore: tuple-typed source shape unwired (only the bare/cast tuple literal carries a full payload; see #72)\n"; os.write(2, m72.ptr, m72.len: u64); os.exit(1); @@ -19864,9 +19864,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s }; }; if (tupsrc != nil) { - let stu: *tinfo = src.type_: *tinfo; - for (stu != nil && stu.kind == tykind.TY_NAMED) { stu = stu.under; }; - if (stu != nil) { if (stu.kind == tykind.TY_TUPLE) { + if (su != nil) { if (su.kind == tykind.TY_TUPLE) { // #242/#241: mirror cstage's loud-stop CONDITION, not its // -1 mechanism (rule 10, align the RICHER side DOWN). // wwstage types `true`/`false` as bool and a suffix-less `7` @@ -19929,9 +19927,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // tagged-in-tuple-in-union packing is the // #242/#22b family. Mirrors cstage. let ceti: *tinfo = ce.type_: *tinfo; - for (ceti != nil && ceti.kind == tykind.TY_NAMED) { - ceti = ceti.under; - }; + ceti = tichase(ceti); if (ceti != nil && ceti.kind == tykind.TY_TAGGED) { let m22: str = "cgwidentaggedstore: tagged element in a tuple-in-union payload unwired (see #242/#22b)\n"; os.write(2, m22.ptr, m22.len: u64); @@ -20152,13 +20148,13 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s let wantf32: bool = (fkind == 1); let ftag: i32 = -1; let fti: *tinfo = dt; - for (fti != nil && fti.kind == tykind.TY_NAMED) { fti = fti.under; }; + fti = tichase(fti); if (fti != nil) { if (fti.kind == tykind.TY_TAGGED) { let fp: *tparam = fti.params; let fidx: i32 = 0; for (fp != nil) { let fvt: *tinfo = fp.type_; - for (fvt != nil && fvt.kind == tykind.TY_NAMED) { fvt = fvt.under; }; + fvt = tichase(fvt); if (fvt != nil) { if (typeisfloat(fvt)) { if (typeisf32(fvt) == wantf32) { ftag = fidx; break; }; diff --git a/selfhost/cmd/wcc/cgenutil.ww b/selfhost/cmd/wcc/cgenutil.ww index 6e5b6dc7..71eea187 100644 --- a/selfhost/cmd/wcc/cgenutil.ww +++ b/selfhost/cmd/wcc/cgenutil.ww @@ -3130,9 +3130,20 @@ fn rhsstructpayload(c: *cgen, src: *node) str = { let tn: *node = lc.tnode; if (tn != nil) { if (tn.kind == nkind.N_TNAME) { - if (structlookup(c, tn.str) != nil) { - return tn.str; - }; + // #62 Layer-2 (F2 ww half): bare structlookup + // missed an alias name (ali->base), so the + // struct value fell to the SCALAR widen arm — + // word0-only box payload, words 1+ zero-filled + // (both-wrong-identical with cstage pre-F1, + // gate-blind). structlookupchain is the name- + // domain twin of cstage's su=type_chase_named + // (cg_widen_tagged_store, c138605); returning + // the REGISTERED name keeps every consumer's + // re-lookup hitting. The variant TAG still + // keys on the un-chased stamped type — the + // member's nominal identity is the alias. + let si: *structinfo = structlookupchain(c, tn); + if (si != nil) { return si.sname; }; }; }; }; @@ -3412,7 +3423,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // (cmd/w6c/cgen.c:1273). resolvetagged's N_TBANG unwrap is already // handled upstream by tinfofornode (check.ww:1203-1210). let dt: *tinfo = dst; - for (dt != nil && dt.kind == tykind.TY_NAMED) { dt = dt.under; }; + dt = tichase(dt); if (dt == nil) { return; }; if (dt.kind != tykind.TY_TAGGED) { return; }; // Nullable fold: one 8B word holding the pointer (or 0 for void). @@ -3467,9 +3478,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s if (castrhs != nil) { let castt: *tinfo = castrhs.type_: *tinfo; let castu: *tinfo = castt; - for (castu != nil && castu.kind == tykind.TY_NAMED) { - castu = castu.under; - }; + castu = tichase(castu); if (castu != nil) { if (castu == dt) { castisdst = true; @@ -3486,6 +3495,13 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s }; }; }; + // #62 Layer-2: ONE source-classify chase at entry (post cast peels, + // where src is final) — the per-arm single reads it replaces all + // chased the same src.type_. Mirrors cstage cg_widen_tagged_store's + // `su = type_chase_named(st)` position (c138605). Tag lookups keep + // the un-chased src.type_ (nominal identity is the alias). + let su: *tinfo = src.type_: *tinfo; + su = tichase(su); // #218: is the source itself a single NESTED variant of dt (its // whole tagged type matches one dt variant), rather than a flattened // SUBSET whose members spread into dt? If so, the inner tagged value @@ -3521,10 +3537,6 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s os.write(2, msg.ptr, msg.len: u64); os.exit(1); }; - let su: *tinfo = src.type_: *tinfo; - for (su != nil && su.kind == tykind.TY_NAMED) { - su = su.under; - }; let ssz: i32 = su.size: i32; emitline("\tXORQ\tAX, AX\n"); let zk: i32 = 0; @@ -3669,11 +3681,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // tag-remap — the mem-based twin of the ident arm above. // Mirrors cstage cg_widen_tagged_store's memread arm. if (taggedmemread(c, src)) { - let su37: *tinfo = src.type_: *tinfo; - for (su37 != nil && su37.kind == tykind.TY_NAMED) { - su37 = su37.under; - }; - let ssz37: i32 = su37.size: i32; + let ssz37: i32 = su.size: i32; cgexpr(c, src); let mk37: i32 = 0; for (mk37 < ssz37) { @@ -3726,12 +3734,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // cg_widen_tagged_store's generic-else bound. Surfaced by // reviewer-37's `let w = *p` probe on a 56B box: cstage loud, // wwstage silent (rule-10 break). - let sf37: *tinfo = src.type_: *tinfo; - for (sf37 != nil && sf37.kind == tykind.TY_NAMED) { - sf37 = sf37.under; - }; - if (sf37 != nil && sf37.kind == tykind.TY_TAGGED - && sf37.size: i32 > TUPLE_GPCAP * 8) { + if (su != nil && su.kind == tykind.TY_TAGGED + && su.size: i32 > TUPLE_GPCAP * 8) { let m37f: str = "#37: >32B tagged source of a non-mem-based kind unwired (rule 7)\n"; os.write(2, m37f.ptr, m37f.len: u64); os.exit(1); @@ -3740,8 +3744,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // taggedcastpeel (cast to a THIRD union) would fall to the // scalar arm below and silently truncate — loud. Mirrors // cstage's widen subset-arm cast bound. - if (src.kind == nkind.N_CAST && sf37 != nil - && sf37.kind == tykind.TY_TAGGED && sf37.nullable == 0) { + if (src.kind == nkind.N_CAST && su != nil + && su.kind == tykind.TY_TAGGED && su.nullable == 0) { let m35b: str = "#35: tagged cast source shape unwired at the widen subset arm (rule 7)\n"; os.write(2, m35b.ptr, m35b.len: u64); os.exit(1); @@ -3778,12 +3782,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // the word-copy / cursor-receive arms are wired. Mirrors // cstage cg_widen_tagged_store. if (tupsrc == nil) { - let stu72: *tinfo = src.type_: *tinfo; - for (stu72 != nil && stu72.kind == tykind.TY_NAMED) { - stu72 = stu72.under; - }; - if (stu72 != nil) { - if (stu72.kind == tykind.TY_TUPLE) { + if (su != nil) { + if (su.kind == tykind.TY_TUPLE) { let m72: str = "cgwidentaggedstore: tuple-typed source shape unwired (only the bare/cast tuple literal carries a full payload; see #72)\n"; os.write(2, m72.ptr, m72.len: u64); os.exit(1); @@ -3792,9 +3792,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s }; }; if (tupsrc != nil) { - let stu: *tinfo = src.type_: *tinfo; - for (stu != nil && stu.kind == tykind.TY_NAMED) { stu = stu.under; }; - if (stu != nil) { if (stu.kind == tykind.TY_TUPLE) { + if (su != nil) { if (su.kind == tykind.TY_TUPLE) { // #242/#241: mirror cstage's loud-stop CONDITION, not its // -1 mechanism (rule 10, align the RICHER side DOWN). // wwstage types `true`/`false` as bool and a suffix-less `7` @@ -3857,9 +3855,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // tagged-in-tuple-in-union packing is the // #242/#22b family. Mirrors cstage. let ceti: *tinfo = ce.type_: *tinfo; - for (ceti != nil && ceti.kind == tykind.TY_NAMED) { - ceti = ceti.under; - }; + ceti = tichase(ceti); if (ceti != nil && ceti.kind == tykind.TY_TAGGED) { let m22: str = "cgwidentaggedstore: tagged element in a tuple-in-union payload unwired (see #242/#22b)\n"; os.write(2, m22.ptr, m22.len: u64); @@ -4080,13 +4076,13 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s let wantf32: bool = (fkind == 1); let ftag: i32 = -1; let fti: *tinfo = dt; - for (fti != nil && fti.kind == tykind.TY_NAMED) { fti = fti.under; }; + fti = tichase(fti); if (fti != nil) { if (fti.kind == tykind.TY_TAGGED) { let fp: *tparam = fti.params; let fidx: i32 = 0; for (fp != nil) { let fvt: *tinfo = fp.type_; - for (fvt != nil && fvt.kind == tykind.TY_NAMED) { fvt = fvt.under; }; + fvt = tichase(fvt); if (fvt != nil) { if (typeisfloat(fvt)) { if (typeisf32(fvt) == wantf32) { ftag = fidx; break; }; diff --git a/selfhost/cmd/wwdump/main.combined.ww b/selfhost/cmd/wwdump/main.combined.ww index fbf48492..18e9897d 100644 --- a/selfhost/cmd/wwdump/main.combined.ww +++ b/selfhost/cmd/wwdump/main.combined.ww @@ -19202,9 +19202,20 @@ fn rhsstructpayload(c: *cgen, src: *node) str = { let tn: *node = lc.tnode; if (tn != nil) { if (tn.kind == nkind.N_TNAME) { - if (structlookup(c, tn.str) != nil) { - return tn.str; - }; + // #62 Layer-2 (F2 ww half): bare structlookup + // missed an alias name (ali->base), so the + // struct value fell to the SCALAR widen arm — + // word0-only box payload, words 1+ zero-filled + // (both-wrong-identical with cstage pre-F1, + // gate-blind). structlookupchain is the name- + // domain twin of cstage's su=type_chase_named + // (cg_widen_tagged_store, c138605); returning + // the REGISTERED name keeps every consumer's + // re-lookup hitting. The variant TAG still + // keys on the un-chased stamped type — the + // member's nominal identity is the alias. + let si: *structinfo = structlookupchain(c, tn); + if (si != nil) { return si.sname; }; }; }; }; @@ -19484,7 +19495,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // (cmd/w6c/cgen.c:1273). resolvetagged's N_TBANG unwrap is already // handled upstream by tinfofornode (check.ww:1203-1210). let dt: *tinfo = dst; - for (dt != nil && dt.kind == tykind.TY_NAMED) { dt = dt.under; }; + dt = tichase(dt); if (dt == nil) { return; }; if (dt.kind != tykind.TY_TAGGED) { return; }; // Nullable fold: one 8B word holding the pointer (or 0 for void). @@ -19539,9 +19550,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s if (castrhs != nil) { let castt: *tinfo = castrhs.type_: *tinfo; let castu: *tinfo = castt; - for (castu != nil && castu.kind == tykind.TY_NAMED) { - castu = castu.under; - }; + castu = tichase(castu); if (castu != nil) { if (castu == dt) { castisdst = true; @@ -19558,6 +19567,13 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s }; }; }; + // #62 Layer-2: ONE source-classify chase at entry (post cast peels, + // where src is final) — the per-arm single reads it replaces all + // chased the same src.type_. Mirrors cstage cg_widen_tagged_store's + // `su = type_chase_named(st)` position (c138605). Tag lookups keep + // the un-chased src.type_ (nominal identity is the alias). + let su: *tinfo = src.type_: *tinfo; + su = tichase(su); // #218: is the source itself a single NESTED variant of dt (its // whole tagged type matches one dt variant), rather than a flattened // SUBSET whose members spread into dt? If so, the inner tagged value @@ -19593,10 +19609,6 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s os.write(2, msg.ptr, msg.len: u64); os.exit(1); }; - let su: *tinfo = src.type_: *tinfo; - for (su != nil && su.kind == tykind.TY_NAMED) { - su = su.under; - }; let ssz: i32 = su.size: i32; emitline("\tXORQ\tAX, AX\n"); let zk: i32 = 0; @@ -19741,11 +19753,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // tag-remap — the mem-based twin of the ident arm above. // Mirrors cstage cg_widen_tagged_store's memread arm. if (taggedmemread(c, src)) { - let su37: *tinfo = src.type_: *tinfo; - for (su37 != nil && su37.kind == tykind.TY_NAMED) { - su37 = su37.under; - }; - let ssz37: i32 = su37.size: i32; + let ssz37: i32 = su.size: i32; cgexpr(c, src); let mk37: i32 = 0; for (mk37 < ssz37) { @@ -19798,12 +19806,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // cg_widen_tagged_store's generic-else bound. Surfaced by // reviewer-37's `let w = *p` probe on a 56B box: cstage loud, // wwstage silent (rule-10 break). - let sf37: *tinfo = src.type_: *tinfo; - for (sf37 != nil && sf37.kind == tykind.TY_NAMED) { - sf37 = sf37.under; - }; - if (sf37 != nil && sf37.kind == tykind.TY_TAGGED - && sf37.size: i32 > TUPLE_GPCAP * 8) { + if (su != nil && su.kind == tykind.TY_TAGGED + && su.size: i32 > TUPLE_GPCAP * 8) { let m37f: str = "#37: >32B tagged source of a non-mem-based kind unwired (rule 7)\n"; os.write(2, m37f.ptr, m37f.len: u64); os.exit(1); @@ -19812,8 +19816,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // taggedcastpeel (cast to a THIRD union) would fall to the // scalar arm below and silently truncate — loud. Mirrors // cstage's widen subset-arm cast bound. - if (src.kind == nkind.N_CAST && sf37 != nil - && sf37.kind == tykind.TY_TAGGED && sf37.nullable == 0) { + if (src.kind == nkind.N_CAST && su != nil + && su.kind == tykind.TY_TAGGED && su.nullable == 0) { let m35b: str = "#35: tagged cast source shape unwired at the widen subset arm (rule 7)\n"; os.write(2, m35b.ptr, m35b.len: u64); os.exit(1); @@ -19850,12 +19854,8 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // the word-copy / cursor-receive arms are wired. Mirrors // cstage cg_widen_tagged_store. if (tupsrc == nil) { - let stu72: *tinfo = src.type_: *tinfo; - for (stu72 != nil && stu72.kind == tykind.TY_NAMED) { - stu72 = stu72.under; - }; - if (stu72 != nil) { - if (stu72.kind == tykind.TY_TUPLE) { + if (su != nil) { + if (su.kind == tykind.TY_TUPLE) { let m72: str = "cgwidentaggedstore: tuple-typed source shape unwired (only the bare/cast tuple literal carries a full payload; see #72)\n"; os.write(2, m72.ptr, m72.len: u64); os.exit(1); @@ -19864,9 +19864,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s }; }; if (tupsrc != nil) { - let stu: *tinfo = src.type_: *tinfo; - for (stu != nil && stu.kind == tykind.TY_NAMED) { stu = stu.under; }; - if (stu != nil) { if (stu.kind == tykind.TY_TUPLE) { + if (su != nil) { if (su.kind == tykind.TY_TUPLE) { // #242/#241: mirror cstage's loud-stop CONDITION, not its // -1 mechanism (rule 10, align the RICHER side DOWN). // wwstage types `true`/`false` as bool and a suffix-less `7` @@ -19929,9 +19927,7 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s // tagged-in-tuple-in-union packing is the // #242/#22b family. Mirrors cstage. let ceti: *tinfo = ce.type_: *tinfo; - for (ceti != nil && ceti.kind == tykind.TY_NAMED) { - ceti = ceti.under; - }; + ceti = tichase(ceti); if (ceti != nil && ceti.kind == tykind.TY_TAGGED) { let m22: str = "cgwidentaggedstore: tagged element in a tuple-in-union payload unwired (see #242/#22b)\n"; os.write(2, m22.ptr, m22.len: u64); @@ -20152,13 +20148,13 @@ fn cgwidentaggedstorebp(c: *cgen, dst: *tinfo, src: *node, slot_off: i32, slot_s let wantf32: bool = (fkind == 1); let ftag: i32 = -1; let fti: *tinfo = dt; - for (fti != nil && fti.kind == tykind.TY_NAMED) { fti = fti.under; }; + fti = tichase(fti); if (fti != nil) { if (fti.kind == tykind.TY_TAGGED) { let fp: *tparam = fti.params; let fidx: i32 = 0; for (fp != nil) { let fvt: *tinfo = fp.type_; - for (fvt != nil && fvt.kind == tykind.TY_NAMED) { fvt = fvt.under; }; + fvt = tichase(fvt); if (fvt != nil) { if (typeisfloat(fvt)) { if (typeisf32(fvt) == wantf32) { ftag = fidx; break; }; diff --git a/test/wcc/944_alias_accept_run.c b/test/wcc/944_alias_accept_run.c index 3f440adc..182dfb88 100644 --- a/test/wcc/944_alias_accept_run.c +++ b/test/wcc/944_alias_accept_run.c @@ -43,11 +43,11 @@ * | struct-lit, walk leaves, reads); | * | unprobed gates LOUD-tripwired (#73, | * | K_BUILDERR_CS pin) | 0 - * union_store_* + | task #62 Layer-2 (cs half): alias- | - * union_push_arg | NAMED struct as union member — widen | - * | store/push word0-only; CS-ONLY until | - * | F2 lands the wwstage half; base ctl | - * | + the #54-bound `as` row pinned loud | 0(cs) + * union_store_* + | task #62 Layer-2: alias-NAMED struct | + * union_push_arg | as union member — widen store/push | + * | word0-only; cs half c138605, ww half | + * | F2a batch-2 c2 — graduated K_RUN; | + * | base ctl + #54-bound `as` row loud | 0 * nested_alias_field_* | task #71: alias-typed nested-field | * | store/read/addr-of walks fold to | * | direct offsets (byte-id graduation, | @@ -657,14 +657,17 @@ static const struct row rows[] = { " if (take(x) != 26) { return 1; };\n" " return 0;\n" "};\n", 0, K_RUN, NULL }, - /* ---- task #62 Layer-2 (cstage half): alias-NAMED struct as a - * UNION MEMBER. The widen store/push su single peel fell past the - * struct arm to the scalar arm — word0-only payload (the banked - * rows /tmp/impl62r_layer2_rows.md; both-wrong-identical with - * wwstage at normal decl order = gate-blind byte-id). CS-ONLY - * until F2 routes wwstage rhsstructpayload/push through - * structlookupchain — flip these to K_RUN then. Values distinct - * per word; the LAST payload word is always checked. */ + /* ---- task #62 Layer-2: alias-NAMED struct as a UNION MEMBER. + * The widen store/push source classify fell past the struct arm + * to the scalar arm — word0-only payload (the banked rows + * /tmp/impl62r_layer2_rows.md; both-wrong-identical at normal + * decl order = gate-blind byte-id). cs half c138605 + * (cg_widen_tagged_store/push su chase); ww half F2a batch-2 c2 + * (rhsstructpayload -> structlookupchain) — K_RUN, byte-id. + * Values distinct per word; the LAST payload word is always + * checked. The RETURN-position leg stays both-stage divergent — + * cs cgreturn residual, task #89 (ww runtime-correct since c2; + * not pinned here until the cs half lands). */ { "union_store_norm", /* banked row L2-1 (= F0 m5b_match1) */ "package main;\n" "type base = struct { a: size, b: size };\n" @@ -681,7 +684,7 @@ static const struct row rows[] = { " case void => { return 3; };\n" " };\n" " return 0;\n" - "};\n", 0, K_RUN_CS, NULL }, /* ww: task #62 F2 */ + "};\n", 0, K_RUN, NULL }, { "union_store_fwd", /* banked row L2-2 (= F0 m5_match) */ "package main;\n" "type ali = base;\n" @@ -698,7 +701,7 @@ static const struct row rows[] = { " case void => { return 3; };\n" " };\n" " return 0;\n" - "};\n", 0, K_RUN_CS, NULL }, /* ww: task #62 F2 */ + "};\n", 0, K_RUN, NULL }, { "union_store_3word", /* banked row L2-4: pins the width LOOP */ "package main;\n" "type base = struct { a: size, b: size, c: size };\n" @@ -715,7 +718,7 @@ static const struct row rows[] = { " case void => { return 3; };\n" " };\n" " return 0;\n" - "};\n", 0, K_RUN_CS, NULL }, /* ww: task #62 F2 */ + "};\n", 0, K_RUN, NULL }, { "union_push_arg", /* the cg_widen_tagged_push twin (F1 find) */ "package main;\n" "type base = struct { a: size, b: size };\n" @@ -731,7 +734,7 @@ static const struct row rows[] = { " x.a = 4; x.b = 9;\n" " if (peek(x) != 9) { return 1; };\n" " return 0;\n" - "};\n", 0, K_RUN_CS, NULL }, /* ww: task #62 F2 */ + "};\n", 0, K_RUN, NULL }, /* banked row L2-5: the m5b_match0 gold invariant — base spelling * indistinguishable (ken oracle PART 1.7). */ { "union_store_base_ctl",