wcc_ww: c1 collapse plain TY_NAMED chase loops into tichase across cgenstmt/cgen/check — byte-id neutral

F2a batch-4 c1, mechanical, per rob's spec census (re-verified at
4adf914; check.ww/cgenstmt.ww cites were stable as predicted, the
two cgenutil [B3-SHIFT] cites moved +8: :2746->:2754, :2895->:2903).

42 conversions, every site eyes-classified plain nil+NAMED:
- cgenstmt.ww 26: one-line :149 :325 :352 :532 :551 :594 :715 :732
  :938 :940 :1577 :1629 :1782 :2230 :2575 :3372 :3678 + multi-line
  :986 :1912 :2287 :2291 :2702 :2759 :2823 :3037 :3715 (all plain,
  no extra guards).
- cgen.ww 13: one-line :1505 :1541 :1658 :1691 :1697 :1947 :1951
  :2065 :2109 :2118 + multi-line :2239 :2648 :2663 (incl. the
  emitdefconstants struct/array arms — plain).
- check.ww 3: :1627 tupleelemslot, :1673 fieldslotsize, :4111 arrlit
  elem chase; WHY comments kept. tichase visibility verified: same
  `package wcc` (cgenstmt/cgen already call it) — no second helper.

Survivors (classified, untouched):
- cgenutil.ww :1301 tichase's own body (the accessor) + :2754
  nullableptrtag single peel (batch-2 c3-B2 PROBE-CLEARED, 018ef66 —
  peel-ok annotation added this commit, cites the banked record; cs
  twin cmd/w6c/cgen.c:747 verified at this SHA) + :2903
  flatvariantidxt pass-2 guard (batch-4 c2's site).
- check.ww :1765 comment + :1805 construction write (peellint-ok
  annotation added — the one WRITE building the NAMED link) + :2038
  spread peel (c3-B1) + :2273/:2275 &len/cap hand-walk (c3-B2) +
  :3666 comment FALSE POSITIVE ("io.underread" matches `.under`).
- cgenexpr.ww :2886 comment only.

Lint note for the peellint finale: the `.under` token-match must be
token-bounded — check.ww:3666's "io.underread" is a comment
false-positive at a non-boundary match.

Behavior sites (:2038, :2273/:2275, :2903) and #80's site excluded
per spec — they ride c2-c4.

Byte-neutral proof: rebuilt w6c_ww on the five BASE main.combined.ww
inputs -> all five .s byte-identical to the base build's outputs;
cs==ww byte-id holds on the five REGENERATED combineds; test-unit
290 green. w6c_ww + wwdump combined.ww regens ride along.
This commit is contained in:
2026-06-05 23:58:54 +09:00
parent 4adf914f2f
commit b26b3dbdc5
6 changed files with 147 additions and 198 deletions

View File

@@ -11896,7 +11896,7 @@ fn tupleelemslot(pt: *tinfo) u64 = {
// now fires on aliased operands; byte-id holds because it collapses
// NAMED to the alias-invariant underlying this read consumes.
let t: *tinfo = pt;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8u64; };
let pk: tykind = t.kind;
if (pk == tykind.TY_VOID) { return 0u64; };
@@ -11942,7 +11942,7 @@ fn fieldslotsize(ft: *tinfo) u64 = {
// now fires on aliased operands; byte-id holds because it collapses
// NAMED to the alias-invariant underlying this read consumes.
let t: *tinfo = ft;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8u64; };
let fk: tykind = t.kind;
if (fk == tykind.TY_STRUCT) { return t.slotsize; };
@@ -12074,6 +12074,9 @@ fn tinfofornode(c: *checker, n: *node) *tinfo = {
under = c.tc.tyerr;
};
named.resolving = 0;
// peellint-ok: construction — the one
// WRITE that builds the NAMED link;
// not a peel, can't route via tichase.
named.under = under;
if (under != nil) {
named.size = under.size;
@@ -14380,7 +14383,7 @@ fn checkarrlitfits(c: *checker, arrtn: *node, rhs: *node) void = {
let at: *tinfo = tinfofornode(c, arrtn);
let et: *tinfo = nil;
if (at != nil) { et = at.sub; };
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let e: *node = rhs.list;
for (e != nil) {
let skip: bool = false;
@@ -18823,6 +18826,10 @@ export fn nullableptrtag(t: *node) i32 = {
for (p != nil) {
let vt: *tinfo = p.type_;
if (vt != nil) {
// peel-ok: single peel PROBE-CLEARED (batch-2 c3-B2,
// 018ef66) — constructible variant params never carry
// 2+-level NAMED at this scan; cs twin nullable_ptr_tag
// (cmd/w6c/cgen.c:747) keeps the identical single peel.
if (vt.kind == tykind.TY_NAMED) { vt = vt.under; };
if (vt != nil) {
if (vt.kind == tykind.TY_PTR) { return i; };
@@ -32423,7 +32430,7 @@ fn tupsse(i: i32) str = {
// tuple_eslot (cmd/w6c/cgen.c).
export fn tupeslot(ti: *tinfo) i32 = {
let t: *tinfo = ti;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8; };
if (t.kind == tykind.TY_VOID) { return 0; };
// a literal tuple's stamped element can be untyped_str (size 0) —
@@ -32599,7 +32606,7 @@ fn tuplitgpwords(c: *cgen, e: *node, dtn: *node) i32 = {
return (tyslicesize() / 8i64): i32;
};
let t: *tinfo = e.type_: *tinfo;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t != nil && (t.kind == tykind.TY_TAGGED ||
t.kind == tykind.TY_VOID)) {
return tupeslotn(e) / 8;
@@ -32626,7 +32633,7 @@ fn tuplitgpwords(c: *cgen, e: *node, dtn: *node) i32 = {
// the slot — loud (rule 7, the #23/#40 widening family).
fn tuplitpushelem(c: *cgen, e: *node, dtn: *node) void = {
let t: *tinfo = e.type_: *tinfo;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
let etagged: bool = false;
if (t != nil) { if (t.kind == tykind.TY_TAGGED) { etagged = true; }; };
if (dtn != nil) {
@@ -32806,7 +32813,7 @@ fn cgtupleslottocursor(c: *cgen, srcoff: i32, tu: *tinfo) void = {
let el: *ttupleelem = tu.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
if (et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64)) {
ssecount = ssecount + 1;
} else {
@@ -32825,7 +32832,7 @@ fn cgtupleslottocursor(c: *cgen, srcoff: i32, tu: *tinfo) void = {
el = tu.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let isflt: bool = et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64);
let eslot: i32 = tupeslot(el.type_);
if (isflt) {
@@ -32868,7 +32875,7 @@ fn cgtaggedtuplepayloadshift(c: *cgen, tup: *tinfo) void = {
let el: *ttupleelem = tup.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let isflt: bool = et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64);
if (isflt || tupeslot(el.type_) != 8) {
let msg: str = "tuple-in-union ? unwrap: float/slice/str/tagged payload element needs SysV per-eightbyte classification (see #243); only integer tuple payloads supported\n";
@@ -32989,7 +32996,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
for (we != nil) {
let dt: *tinfo = nil;
if (pt != nil) { dt = pt.lhs.type_: *tinfo; };
for (dt != nil && dt.kind == tykind.TY_NAMED) { dt = dt.under; };
dt = tichase(dt);
if (dt != nil && dt.kind == tykind.TY_TAGGED) {
// #22b (task #28): MEMORY-class tagged
// element — the whole box copies through
@@ -33006,7 +33013,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
// N_RETURN over-cap tagged arm.
let eslot: i32 = tupeslotn(pt.lhs);
let eu: *tinfo = we.type_: *tinfo;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
let eoff: i32 = 0;
if (we.kind == nkind.N_IDENT && eu != nil) {
if (eu.kind == tykind.TY_TAGGED && tupeslotn(we) == eslot) {
@@ -33212,9 +33219,9 @@ fn cgreturn(c: *cgen, n: *node) void = {
let forwardtagged: bool = false;
if ((rhs.kind == nkind.N_CALL || rhs.kind == nkind.N_INDEX || rhs.kind == nkind.N_DOT) && rhs.type_ != nil && c.fnret != nil && c.fnret.type_ != nil) {
let ru: *tinfo = rhs.type_: *tinfo;
for (ru != nil && ru.kind == tykind.TY_NAMED) { ru = ru.under; };
ru = tichase(ru);
let fu: *tinfo = c.fnret.type_: *tinfo;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
if (ru != nil && fu != nil && ru.kind == tykind.TY_TAGGED && fu.kind == tykind.TY_TAGGED) {
if (ru == fu) {
forwardtagged = true;
@@ -33259,9 +33266,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
return;
};
let ru38: *tinfo = rhs.type_: *tinfo;
for (ru38 != nil && ru38.kind == tykind.TY_NAMED) {
ru38 = ru38.under;
};
ru38 = tichase(ru38);
if (ru38 != nil) {
// #37 wired the N_INDEX/N_DOT mem-read into
// the widener; the remaining >32B kinds stay
@@ -33851,7 +33856,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
if (rhs.op == tkind.TK_STAR) { arrok = true; };
};
let ati: *tinfo = c.fnret.type_: *tinfo;
for (ati != nil && ati.kind == tykind.TY_NAMED) { ati = ati.under; };
ati = tichase(ati);
if (arrok && ati != nil) {
let rsz: i32 = ati.size: i32;
if (rsz <= 24) {
@@ -33903,7 +33908,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
// elements loud-stop (rule 7, no consumer).
let esubti: *tinfo = nil;
if (ati.sub != nil) { esubti = ati.sub; };
for (esubti != nil && esubti.kind == tykind.TY_NAMED) { esubti = esubti.under; };
esubti = tichase(esubti);
let esz: i32 = 8;
if (esubti != nil) { esz = esubti.size: i32; };
let badel: bool = false;
@@ -34056,7 +34061,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
let aggret: bool = false;
if (c.fnret != nil) {
let rti: *tinfo = c.fnret.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil) {
if (rti.kind == tykind.TY_ARRAY) { aggret = true; };
if (rti.kind == tykind.TY_STRUCT) { aggret = true; };
@@ -34185,9 +34190,7 @@ fn cgarrlitfillbp(c: *cgen, arrtn: *node, rhs: *node, off: i32) void = {
// natural size (cstage esub->size).
let esubti: *tinfo = nil;
if (elemn != nil) { esubti = elemn.type_: *tinfo; };
for (esubti != nil && esubti.kind == tykind.TY_NAMED) {
esubti = esubti.under;
};
esubti = tichase(esubti);
let isagg: bool = esubti != nil
&& (esubti.kind == tykind.TY_STRUCT
|| esubti.kind == tykind.TY_ARRAY
@@ -34504,7 +34507,7 @@ fn cglet(c: *cgen, n: *node) void = {
let nidx: i32 = -1;
let nti: *tinfo = nil;
if (c.fnret != nil) { nti = c.fnret.type_: *tinfo; };
for (nti != nil && nti.kind == tykind.TY_NAMED) { nti = nti.under; };
nti = tichase(nti);
if (nti != nil) { if (nti.kind == tykind.TY_TAGGED) {
let np: *tparam = nti.params;
let nidx2: i32 = 0;
@@ -34560,13 +34563,9 @@ fn cglet(c: *cgen, n: *node) void = {
return;
};
let lru: *tinfo = rhs.type_: *tinfo;
for (lru != nil && lru.kind == tykind.TY_NAMED) {
lru = lru.under;
};
lru = tichase(lru);
let llu: *tinfo = tn.type_: *tinfo;
for (llu != nil && llu.kind == tykind.TY_NAMED) {
llu = llu.under;
};
llu = tichase(llu);
let exact38: bool = false;
if (lru != nil && lru == llu) { exact38 = true; }
else {
@@ -34849,7 +34848,7 @@ fn cglet(c: *cgen, n: *node) void = {
if (rhs.kind == nkind.N_CALL && tn != nil
&& tn.kind == nkind.N_TARRAY) {
let ati: *tinfo = tn.type_: *tinfo;
for (ati != nil && ati.kind == tykind.TY_NAMED) { ati = ati.under; };
ati = tichase(ati);
if (ati != nil) {
let lsz: i32 = ati.size: i32;
let tlm: i32 = lsz - (lsz / 8) * 8;
@@ -34975,9 +34974,7 @@ fn cglet(c: *cgen, n: *node) void = {
} else {
let aggti: *tinfo = nil;
if (tn != nil) { aggti = tn.type_: *tinfo; };
for (aggti != nil && aggti.kind == tykind.TY_NAMED) {
aggti = aggti.under;
};
aggti = tichase(aggti);
if (aggti != nil) {
if (aggti.kind == tykind.TY_ARRAY) {
aggn = aggti.size: i32;
@@ -35032,9 +35029,7 @@ fn cglet(c: *cgen, n: *node) void = {
let idx: *node = rhs.rhs;
let bu: *tinfo = nil;
if (base != nil) { bu = base.type_: *tinfo; };
for (bu != nil && bu.kind == tykind.TY_NAMED) {
bu = bu.under;
};
bu = tichase(bu);
if (base != nil && base.kind == nkind.N_IDENT
&& bu != nil && bu.kind == tykind.TY_ARRAY) {
let esz: i32 = 1;
@@ -35096,9 +35091,7 @@ fn cglet(c: *cgen, n: *node) void = {
let bidx: *node = base.rhs;
let abu: *tinfo = nil;
if (ab != nil) { abu = ab.type_: *tinfo; };
for (abu != nil && abu.kind == tykind.TY_NAMED) {
abu = abu.under;
};
abu = tichase(abu);
if (ab != nil && ab.kind == nkind.N_IDENT
&& abu != nil && abu.kind == tykind.TY_ARRAY) {
let aesz: i32 = 1;
@@ -35310,9 +35303,7 @@ fn cglet(c: *cgen, n: *node) void = {
let szi: *structinfo = structlookupchain(c, n.lhs);
if (szi != nil) {
let ti: *tinfo = n.lhs.type_: *tinfo;
for (ti != nil && ti.kind == tykind.TY_NAMED) {
ti = ti.under;
};
ti = tichase(ti);
if (ti != nil) { zsz = ti.size: i32; };
};
};
@@ -35646,7 +35637,7 @@ fn cgmlet(c: *cgen, n: *node) void = {
let rl: *local = localfindnode(c, rhs.str);
if (rl != nil) {
let rti: *tinfo = rl.tnode.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil) { if (rti.kind == tykind.TY_TUPLE) {
let srcoff: i32 = rl.off;
let foff: i32 = 0;
@@ -35952,7 +35943,7 @@ fn cgforrange(c: *cgen, n: *node) void = {
// synthesis precedent above).
if (slctn == nil && slc != nil) {
let sti2: *tinfo = slc.type_: *tinfo;
for (sti2 != nil && sti2.kind == tykind.TY_NAMED) { sti2 = sti2.under; };
sti2 = tichase(sti2);
if (sti2 != nil) {
if (sti2.kind == tykind.TY_SLICE
|| sti2.kind == tykind.TY_STR
@@ -35988,9 +35979,7 @@ fn cgforrange(c: *cgen, n: *node) void = {
if (slc != nil) {
if (slc.kind != nkind.N_IDENT) {
let stu70: *tinfo = slc.type_: *tinfo;
for (stu70 != nil && stu70.kind == tykind.TY_NAMED) {
stu70 = stu70.under;
};
stu70 = tichase(stu70);
let arr70: bool = false;
if (stu70 != nil) {
if (stu70.kind == tykind.TY_ARRAY) {
@@ -38505,7 +38494,7 @@ fn emitfloatlitdata(c: *cgen, directive: str, name: str, module: str,
fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
base: u64) bool = {
let su: *tinfo = structt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
if (su == nil) { return false; };
if (su.kind != tykind.TY_STRUCT) { return false; };
let pos: u64 = base;
@@ -38541,7 +38530,7 @@ fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
let vr: *node = v;
for (vr != nil && vr.kind == nkind.N_CAST) { vr = vr.lhs; };
let fu: *tinfo = f.type_;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
if (fu != nil && fu.kind == tykind.TY_STRUCT) {
if (vr == nil) {
let m: str = "emitstructlitbytes: nested struct field rhs nil (#129 A.2)\n";
@@ -38658,7 +38647,7 @@ fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
fn emitstructdata(c: *cgen, directive: str, name: str, module: str,
structt: *tinfo, rhs: *node) bool = {
let su: *tinfo = structt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
if (su == nil) { return false; };
if (su.kind != tykind.TY_STRUCT) { return false; };
emitline(directive);
@@ -38691,13 +38680,13 @@ fn emitstructdata(c: *cgen, directive: str, name: str, module: str,
fn emitarraylitbytes(c: *cgen, arrt: *tinfo, rhs: *node,
emit_phase: i32) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
let esz: i32 = au.sub.size: i32;
let alen: i32 = au.alen: i32;
let eu: *tinfo = au.sub;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu != nil && eu.kind == tykind.TY_STRUCT) {
// Validate: every element must be N_STRUCTLIT (after N_CAST).
@@ -38947,11 +38936,11 @@ fn emitarraylitbytes(c: *cgen, arrt: *tinfo, rhs: *node,
fn emitstrarraydata(c: *cgen, directive: str, name: str, module: str,
arrt: *tinfo, rhs: *node) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
let eu: *tinfo = au.sub;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu == nil) { return false; };
if (eu.kind != tykind.TY_STR) { return false; };
if (!streq(directive, "DATAW")) { return false; };
@@ -39065,7 +39054,7 @@ fn emitstrarraydata(c: *cgen, directive: str, name: str, module: str,
fn emitarraydata(c: *cgen, directive: str, name: str, module: str,
arrt: *tinfo, rhs: *node) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
if (rhs == nil) {
@@ -39109,7 +39098,7 @@ fn emitarraydata(c: *cgen, directive: str, name: str, module: str,
fn emitslicedata(c: *cgen, name: str, module: str, slt: *tinfo,
rhs: *node) void = {
let su: *tinfo = slt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
// Defensive, mirrors cstage emit_slice_data's
// `if (u == NULL || u->kind != TY_SLICE) return 0` (rule-10): the
// letvarisslice gate already guarantees a slice, so this is
@@ -39118,7 +39107,7 @@ fn emitslicedata(c: *cgen, name: str, module: str, slt: *tinfo,
if (su == nil || su.kind != tykind.TY_SLICE) { return; };
let etype: *tinfo = su.sub;
let eu: *tinfo = etype;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu != nil) {
if (eu.kind == tykind.TY_STR || eu.kind == tykind.TY_SLICE
|| eu.kind == tykind.TY_TAGGED) {
@@ -39238,9 +39227,7 @@ fn emittupledata(c: *cgen, name: str, module: str, tt: *node, rhs: *node) bool =
{
let eti: *tinfo = nil;
if (et != nil) { eti = et.type_: *tinfo; };
for (eti != nil && eti.kind == tykind.TY_NAMED) {
eti = eti.under;
};
eti = tichase(eti);
if (eti != nil && eti.kind == tykind.TY_TAGGED) {
return false;
};
@@ -39647,9 +39634,7 @@ fn emitdefconstants(c: *cgen, file: *node) void = {
if (r != nil) { if (r.kind == nkind.N_STRUCTLIT) {
let st: *tinfo = d.lhs.type_: *tinfo;
let su: *tinfo = st;
for (su != nil && su.kind == tykind.TY_NAMED) {
su = su.under;
};
su = tichase(su);
if (su != nil) {
if (su.kind == tykind.TY_STRUCT) {
emitstructdata(c, "DATA",
@@ -39662,9 +39647,7 @@ fn emitdefconstants(c: *cgen, file: *node) void = {
if (r != nil) { if (r.kind == nkind.N_ARRLIT) {
let at: *tinfo = d.lhs.type_: *tinfo;
let au: *tinfo = at;
for (au != nil && au.kind == tykind.TY_NAMED) {
au = au.under;
};
au = tichase(au);
if (au != nil) {
if (au.kind == tykind.TY_ARRAY) {
emitarraydata(c, "DATA",

View File

@@ -1502,7 +1502,7 @@ fn emitfloatlitdata(c: *cgen, directive: str, name: str, module: str,
fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
base: u64) bool = {
let su: *tinfo = structt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
if (su == nil) { return false; };
if (su.kind != tykind.TY_STRUCT) { return false; };
let pos: u64 = base;
@@ -1538,7 +1538,7 @@ fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
let vr: *node = v;
for (vr != nil && vr.kind == nkind.N_CAST) { vr = vr.lhs; };
let fu: *tinfo = f.type_;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
if (fu != nil && fu.kind == tykind.TY_STRUCT) {
if (vr == nil) {
let m: str = "emitstructlitbytes: nested struct field rhs nil (#129 A.2)\n";
@@ -1655,7 +1655,7 @@ fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
fn emitstructdata(c: *cgen, directive: str, name: str, module: str,
structt: *tinfo, rhs: *node) bool = {
let su: *tinfo = structt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
if (su == nil) { return false; };
if (su.kind != tykind.TY_STRUCT) { return false; };
emitline(directive);
@@ -1688,13 +1688,13 @@ fn emitstructdata(c: *cgen, directive: str, name: str, module: str,
fn emitarraylitbytes(c: *cgen, arrt: *tinfo, rhs: *node,
emit_phase: i32) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
let esz: i32 = au.sub.size: i32;
let alen: i32 = au.alen: i32;
let eu: *tinfo = au.sub;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu != nil && eu.kind == tykind.TY_STRUCT) {
// Validate: every element must be N_STRUCTLIT (after N_CAST).
@@ -1944,11 +1944,11 @@ fn emitarraylitbytes(c: *cgen, arrt: *tinfo, rhs: *node,
fn emitstrarraydata(c: *cgen, directive: str, name: str, module: str,
arrt: *tinfo, rhs: *node) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
let eu: *tinfo = au.sub;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu == nil) { return false; };
if (eu.kind != tykind.TY_STR) { return false; };
if (!streq(directive, "DATAW")) { return false; };
@@ -2062,7 +2062,7 @@ fn emitstrarraydata(c: *cgen, directive: str, name: str, module: str,
fn emitarraydata(c: *cgen, directive: str, name: str, module: str,
arrt: *tinfo, rhs: *node) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
if (rhs == nil) {
@@ -2106,7 +2106,7 @@ fn emitarraydata(c: *cgen, directive: str, name: str, module: str,
fn emitslicedata(c: *cgen, name: str, module: str, slt: *tinfo,
rhs: *node) void = {
let su: *tinfo = slt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
// Defensive, mirrors cstage emit_slice_data's
// `if (u == NULL || u->kind != TY_SLICE) return 0` (rule-10): the
// letvarisslice gate already guarantees a slice, so this is
@@ -2115,7 +2115,7 @@ fn emitslicedata(c: *cgen, name: str, module: str, slt: *tinfo,
if (su == nil || su.kind != tykind.TY_SLICE) { return; };
let etype: *tinfo = su.sub;
let eu: *tinfo = etype;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu != nil) {
if (eu.kind == tykind.TY_STR || eu.kind == tykind.TY_SLICE
|| eu.kind == tykind.TY_TAGGED) {
@@ -2235,9 +2235,7 @@ fn emittupledata(c: *cgen, name: str, module: str, tt: *node, rhs: *node) bool =
{
let eti: *tinfo = nil;
if (et != nil) { eti = et.type_: *tinfo; };
for (eti != nil && eti.kind == tykind.TY_NAMED) {
eti = eti.under;
};
eti = tichase(eti);
if (eti != nil && eti.kind == tykind.TY_TAGGED) {
return false;
};
@@ -2644,9 +2642,7 @@ fn emitdefconstants(c: *cgen, file: *node) void = {
if (r != nil) { if (r.kind == nkind.N_STRUCTLIT) {
let st: *tinfo = d.lhs.type_: *tinfo;
let su: *tinfo = st;
for (su != nil && su.kind == tykind.TY_NAMED) {
su = su.under;
};
su = tichase(su);
if (su != nil) {
if (su.kind == tykind.TY_STRUCT) {
emitstructdata(c, "DATA",
@@ -2659,9 +2655,7 @@ fn emitdefconstants(c: *cgen, file: *node) void = {
if (r != nil) { if (r.kind == nkind.N_ARRLIT) {
let at: *tinfo = d.lhs.type_: *tinfo;
let au: *tinfo = at;
for (au != nil && au.kind == tykind.TY_NAMED) {
au = au.under;
};
au = tichase(au);
if (au != nil) {
if (au.kind == tykind.TY_ARRAY) {
emitarraydata(c, "DATA",

View File

@@ -146,7 +146,7 @@ fn tupsse(i: i32) str = {
// tuple_eslot (cmd/w6c/cgen.c).
export fn tupeslot(ti: *tinfo) i32 = {
let t: *tinfo = ti;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8; };
if (t.kind == tykind.TY_VOID) { return 0; };
// a literal tuple's stamped element can be untyped_str (size 0) —
@@ -322,7 +322,7 @@ fn tuplitgpwords(c: *cgen, e: *node, dtn: *node) i32 = {
return (tyslicesize() / 8i64): i32;
};
let t: *tinfo = e.type_: *tinfo;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t != nil && (t.kind == tykind.TY_TAGGED ||
t.kind == tykind.TY_VOID)) {
return tupeslotn(e) / 8;
@@ -349,7 +349,7 @@ fn tuplitgpwords(c: *cgen, e: *node, dtn: *node) i32 = {
// the slot — loud (rule 7, the #23/#40 widening family).
fn tuplitpushelem(c: *cgen, e: *node, dtn: *node) void = {
let t: *tinfo = e.type_: *tinfo;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
let etagged: bool = false;
if (t != nil) { if (t.kind == tykind.TY_TAGGED) { etagged = true; }; };
if (dtn != nil) {
@@ -529,7 +529,7 @@ fn cgtupleslottocursor(c: *cgen, srcoff: i32, tu: *tinfo) void = {
let el: *ttupleelem = tu.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
if (et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64)) {
ssecount = ssecount + 1;
} else {
@@ -548,7 +548,7 @@ fn cgtupleslottocursor(c: *cgen, srcoff: i32, tu: *tinfo) void = {
el = tu.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let isflt: bool = et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64);
let eslot: i32 = tupeslot(el.type_);
if (isflt) {
@@ -591,7 +591,7 @@ fn cgtaggedtuplepayloadshift(c: *cgen, tup: *tinfo) void = {
let el: *ttupleelem = tup.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let isflt: bool = et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64);
if (isflt || tupeslot(el.type_) != 8) {
let msg: str = "tuple-in-union ? unwrap: float/slice/str/tagged payload element needs SysV per-eightbyte classification (see #243); only integer tuple payloads supported\n";
@@ -712,7 +712,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
for (we != nil) {
let dt: *tinfo = nil;
if (pt != nil) { dt = pt.lhs.type_: *tinfo; };
for (dt != nil && dt.kind == tykind.TY_NAMED) { dt = dt.under; };
dt = tichase(dt);
if (dt != nil && dt.kind == tykind.TY_TAGGED) {
// #22b (task #28): MEMORY-class tagged
// element — the whole box copies through
@@ -729,7 +729,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
// N_RETURN over-cap tagged arm.
let eslot: i32 = tupeslotn(pt.lhs);
let eu: *tinfo = we.type_: *tinfo;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
let eoff: i32 = 0;
if (we.kind == nkind.N_IDENT && eu != nil) {
if (eu.kind == tykind.TY_TAGGED && tupeslotn(we) == eslot) {
@@ -935,9 +935,9 @@ fn cgreturn(c: *cgen, n: *node) void = {
let forwardtagged: bool = false;
if ((rhs.kind == nkind.N_CALL || rhs.kind == nkind.N_INDEX || rhs.kind == nkind.N_DOT) && rhs.type_ != nil && c.fnret != nil && c.fnret.type_ != nil) {
let ru: *tinfo = rhs.type_: *tinfo;
for (ru != nil && ru.kind == tykind.TY_NAMED) { ru = ru.under; };
ru = tichase(ru);
let fu: *tinfo = c.fnret.type_: *tinfo;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
if (ru != nil && fu != nil && ru.kind == tykind.TY_TAGGED && fu.kind == tykind.TY_TAGGED) {
if (ru == fu) {
forwardtagged = true;
@@ -982,9 +982,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
return;
};
let ru38: *tinfo = rhs.type_: *tinfo;
for (ru38 != nil && ru38.kind == tykind.TY_NAMED) {
ru38 = ru38.under;
};
ru38 = tichase(ru38);
if (ru38 != nil) {
// #37 wired the N_INDEX/N_DOT mem-read into
// the widener; the remaining >32B kinds stay
@@ -1574,7 +1572,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
if (rhs.op == tkind.TK_STAR) { arrok = true; };
};
let ati: *tinfo = c.fnret.type_: *tinfo;
for (ati != nil && ati.kind == tykind.TY_NAMED) { ati = ati.under; };
ati = tichase(ati);
if (arrok && ati != nil) {
let rsz: i32 = ati.size: i32;
if (rsz <= 24) {
@@ -1626,7 +1624,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
// elements loud-stop (rule 7, no consumer).
let esubti: *tinfo = nil;
if (ati.sub != nil) { esubti = ati.sub; };
for (esubti != nil && esubti.kind == tykind.TY_NAMED) { esubti = esubti.under; };
esubti = tichase(esubti);
let esz: i32 = 8;
if (esubti != nil) { esz = esubti.size: i32; };
let badel: bool = false;
@@ -1779,7 +1777,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
let aggret: bool = false;
if (c.fnret != nil) {
let rti: *tinfo = c.fnret.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil) {
if (rti.kind == tykind.TY_ARRAY) { aggret = true; };
if (rti.kind == tykind.TY_STRUCT) { aggret = true; };
@@ -1908,9 +1906,7 @@ fn cgarrlitfillbp(c: *cgen, arrtn: *node, rhs: *node, off: i32) void = {
// natural size (cstage esub->size).
let esubti: *tinfo = nil;
if (elemn != nil) { esubti = elemn.type_: *tinfo; };
for (esubti != nil && esubti.kind == tykind.TY_NAMED) {
esubti = esubti.under;
};
esubti = tichase(esubti);
let isagg: bool = esubti != nil
&& (esubti.kind == tykind.TY_STRUCT
|| esubti.kind == tykind.TY_ARRAY
@@ -2227,7 +2223,7 @@ fn cglet(c: *cgen, n: *node) void = {
let nidx: i32 = -1;
let nti: *tinfo = nil;
if (c.fnret != nil) { nti = c.fnret.type_: *tinfo; };
for (nti != nil && nti.kind == tykind.TY_NAMED) { nti = nti.under; };
nti = tichase(nti);
if (nti != nil) { if (nti.kind == tykind.TY_TAGGED) {
let np: *tparam = nti.params;
let nidx2: i32 = 0;
@@ -2283,13 +2279,9 @@ fn cglet(c: *cgen, n: *node) void = {
return;
};
let lru: *tinfo = rhs.type_: *tinfo;
for (lru != nil && lru.kind == tykind.TY_NAMED) {
lru = lru.under;
};
lru = tichase(lru);
let llu: *tinfo = tn.type_: *tinfo;
for (llu != nil && llu.kind == tykind.TY_NAMED) {
llu = llu.under;
};
llu = tichase(llu);
let exact38: bool = false;
if (lru != nil && lru == llu) { exact38 = true; }
else {
@@ -2572,7 +2564,7 @@ fn cglet(c: *cgen, n: *node) void = {
if (rhs.kind == nkind.N_CALL && tn != nil
&& tn.kind == nkind.N_TARRAY) {
let ati: *tinfo = tn.type_: *tinfo;
for (ati != nil && ati.kind == tykind.TY_NAMED) { ati = ati.under; };
ati = tichase(ati);
if (ati != nil) {
let lsz: i32 = ati.size: i32;
let tlm: i32 = lsz - (lsz / 8) * 8;
@@ -2698,9 +2690,7 @@ fn cglet(c: *cgen, n: *node) void = {
} else {
let aggti: *tinfo = nil;
if (tn != nil) { aggti = tn.type_: *tinfo; };
for (aggti != nil && aggti.kind == tykind.TY_NAMED) {
aggti = aggti.under;
};
aggti = tichase(aggti);
if (aggti != nil) {
if (aggti.kind == tykind.TY_ARRAY) {
aggn = aggti.size: i32;
@@ -2755,9 +2745,7 @@ fn cglet(c: *cgen, n: *node) void = {
let idx: *node = rhs.rhs;
let bu: *tinfo = nil;
if (base != nil) { bu = base.type_: *tinfo; };
for (bu != nil && bu.kind == tykind.TY_NAMED) {
bu = bu.under;
};
bu = tichase(bu);
if (base != nil && base.kind == nkind.N_IDENT
&& bu != nil && bu.kind == tykind.TY_ARRAY) {
let esz: i32 = 1;
@@ -2819,9 +2807,7 @@ fn cglet(c: *cgen, n: *node) void = {
let bidx: *node = base.rhs;
let abu: *tinfo = nil;
if (ab != nil) { abu = ab.type_: *tinfo; };
for (abu != nil && abu.kind == tykind.TY_NAMED) {
abu = abu.under;
};
abu = tichase(abu);
if (ab != nil && ab.kind == nkind.N_IDENT
&& abu != nil && abu.kind == tykind.TY_ARRAY) {
let aesz: i32 = 1;
@@ -3033,9 +3019,7 @@ fn cglet(c: *cgen, n: *node) void = {
let szi: *structinfo = structlookupchain(c, n.lhs);
if (szi != nil) {
let ti: *tinfo = n.lhs.type_: *tinfo;
for (ti != nil && ti.kind == tykind.TY_NAMED) {
ti = ti.under;
};
ti = tichase(ti);
if (ti != nil) { zsz = ti.size: i32; };
};
};
@@ -3369,7 +3353,7 @@ fn cgmlet(c: *cgen, n: *node) void = {
let rl: *local = localfindnode(c, rhs.str);
if (rl != nil) {
let rti: *tinfo = rl.tnode.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil) { if (rti.kind == tykind.TY_TUPLE) {
let srcoff: i32 = rl.off;
let foff: i32 = 0;
@@ -3675,7 +3659,7 @@ fn cgforrange(c: *cgen, n: *node) void = {
// synthesis precedent above).
if (slctn == nil && slc != nil) {
let sti2: *tinfo = slc.type_: *tinfo;
for (sti2 != nil && sti2.kind == tykind.TY_NAMED) { sti2 = sti2.under; };
sti2 = tichase(sti2);
if (sti2 != nil) {
if (sti2.kind == tykind.TY_SLICE
|| sti2.kind == tykind.TY_STR
@@ -3711,9 +3695,7 @@ fn cgforrange(c: *cgen, n: *node) void = {
if (slc != nil) {
if (slc.kind != nkind.N_IDENT) {
let stu70: *tinfo = slc.type_: *tinfo;
for (stu70 != nil && stu70.kind == tykind.TY_NAMED) {
stu70 = stu70.under;
};
stu70 = tichase(stu70);
let arr70: bool = false;
if (stu70 != nil) {
if (stu70.kind == tykind.TY_ARRAY) {

View File

@@ -2751,6 +2751,10 @@ export fn nullableptrtag(t: *node) i32 = {
for (p != nil) {
let vt: *tinfo = p.type_;
if (vt != nil) {
// peel-ok: single peel PROBE-CLEARED (batch-2 c3-B2,
// 018ef66) — constructible variant params never carry
// 2+-level NAMED at this scan; cs twin nullable_ptr_tag
// (cmd/w6c/cgen.c:747) keeps the identical single peel.
if (vt.kind == tykind.TY_NAMED) { vt = vt.under; };
if (vt != nil) {
if (vt.kind == tykind.TY_PTR) { return i; };

View File

@@ -1624,7 +1624,7 @@ fn tupleelemslot(pt: *tinfo) u64 = {
// now fires on aliased operands; byte-id holds because it collapses
// NAMED to the alias-invariant underlying this read consumes.
let t: *tinfo = pt;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8u64; };
let pk: tykind = t.kind;
if (pk == tykind.TY_VOID) { return 0u64; };
@@ -1670,7 +1670,7 @@ fn fieldslotsize(ft: *tinfo) u64 = {
// now fires on aliased operands; byte-id holds because it collapses
// NAMED to the alias-invariant underlying this read consumes.
let t: *tinfo = ft;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8u64; };
let fk: tykind = t.kind;
if (fk == tykind.TY_STRUCT) { return t.slotsize; };
@@ -1802,6 +1802,9 @@ fn tinfofornode(c: *checker, n: *node) *tinfo = {
under = c.tc.tyerr;
};
named.resolving = 0;
// peellint-ok: construction — the one
// WRITE that builds the NAMED link;
// not a peel, can't route via tichase.
named.under = under;
if (under != nil) {
named.size = under.size;
@@ -4108,7 +4111,7 @@ fn checkarrlitfits(c: *checker, arrtn: *node, rhs: *node) void = {
let at: *tinfo = tinfofornode(c, arrtn);
let et: *tinfo = nil;
if (at != nil) { et = at.sub; };
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let e: *node = rhs.list;
for (e != nil) {
let skip: bool = false;

View File

@@ -11896,7 +11896,7 @@ fn tupleelemslot(pt: *tinfo) u64 = {
// now fires on aliased operands; byte-id holds because it collapses
// NAMED to the alias-invariant underlying this read consumes.
let t: *tinfo = pt;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8u64; };
let pk: tykind = t.kind;
if (pk == tykind.TY_VOID) { return 0u64; };
@@ -11942,7 +11942,7 @@ fn fieldslotsize(ft: *tinfo) u64 = {
// now fires on aliased operands; byte-id holds because it collapses
// NAMED to the alias-invariant underlying this read consumes.
let t: *tinfo = ft;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8u64; };
let fk: tykind = t.kind;
if (fk == tykind.TY_STRUCT) { return t.slotsize; };
@@ -12074,6 +12074,9 @@ fn tinfofornode(c: *checker, n: *node) *tinfo = {
under = c.tc.tyerr;
};
named.resolving = 0;
// peellint-ok: construction — the one
// WRITE that builds the NAMED link;
// not a peel, can't route via tichase.
named.under = under;
if (under != nil) {
named.size = under.size;
@@ -14380,7 +14383,7 @@ fn checkarrlitfits(c: *checker, arrtn: *node, rhs: *node) void = {
let at: *tinfo = tinfofornode(c, arrtn);
let et: *tinfo = nil;
if (at != nil) { et = at.sub; };
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let e: *node = rhs.list;
for (e != nil) {
let skip: bool = false;
@@ -18823,6 +18826,10 @@ export fn nullableptrtag(t: *node) i32 = {
for (p != nil) {
let vt: *tinfo = p.type_;
if (vt != nil) {
// peel-ok: single peel PROBE-CLEARED (batch-2 c3-B2,
// 018ef66) — constructible variant params never carry
// 2+-level NAMED at this scan; cs twin nullable_ptr_tag
// (cmd/w6c/cgen.c:747) keeps the identical single peel.
if (vt.kind == tykind.TY_NAMED) { vt = vt.under; };
if (vt != nil) {
if (vt.kind == tykind.TY_PTR) { return i; };
@@ -32423,7 +32430,7 @@ fn tupsse(i: i32) str = {
// tuple_eslot (cmd/w6c/cgen.c).
export fn tupeslot(ti: *tinfo) i32 = {
let t: *tinfo = ti;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t == nil) { return 8; };
if (t.kind == tykind.TY_VOID) { return 0; };
// a literal tuple's stamped element can be untyped_str (size 0) —
@@ -32599,7 +32606,7 @@ fn tuplitgpwords(c: *cgen, e: *node, dtn: *node) i32 = {
return (tyslicesize() / 8i64): i32;
};
let t: *tinfo = e.type_: *tinfo;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
if (t != nil && (t.kind == tykind.TY_TAGGED ||
t.kind == tykind.TY_VOID)) {
return tupeslotn(e) / 8;
@@ -32626,7 +32633,7 @@ fn tuplitgpwords(c: *cgen, e: *node, dtn: *node) i32 = {
// the slot — loud (rule 7, the #23/#40 widening family).
fn tuplitpushelem(c: *cgen, e: *node, dtn: *node) void = {
let t: *tinfo = e.type_: *tinfo;
for (t != nil && t.kind == tykind.TY_NAMED) { t = t.under; };
t = tichase(t);
let etagged: bool = false;
if (t != nil) { if (t.kind == tykind.TY_TAGGED) { etagged = true; }; };
if (dtn != nil) {
@@ -32806,7 +32813,7 @@ fn cgtupleslottocursor(c: *cgen, srcoff: i32, tu: *tinfo) void = {
let el: *ttupleelem = tu.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
if (et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64)) {
ssecount = ssecount + 1;
} else {
@@ -32825,7 +32832,7 @@ fn cgtupleslottocursor(c: *cgen, srcoff: i32, tu: *tinfo) void = {
el = tu.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let isflt: bool = et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64);
let eslot: i32 = tupeslot(el.type_);
if (isflt) {
@@ -32868,7 +32875,7 @@ fn cgtaggedtuplepayloadshift(c: *cgen, tup: *tinfo) void = {
let el: *ttupleelem = tup.tupleelems;
for (el != nil) {
let et: *tinfo = el.type_;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
let isflt: bool = et != nil && (et.kind == tykind.TY_F32 || et.kind == tykind.TY_F64);
if (isflt || tupeslot(el.type_) != 8) {
let msg: str = "tuple-in-union ? unwrap: float/slice/str/tagged payload element needs SysV per-eightbyte classification (see #243); only integer tuple payloads supported\n";
@@ -32989,7 +32996,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
for (we != nil) {
let dt: *tinfo = nil;
if (pt != nil) { dt = pt.lhs.type_: *tinfo; };
for (dt != nil && dt.kind == tykind.TY_NAMED) { dt = dt.under; };
dt = tichase(dt);
if (dt != nil && dt.kind == tykind.TY_TAGGED) {
// #22b (task #28): MEMORY-class tagged
// element — the whole box copies through
@@ -33006,7 +33013,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
// N_RETURN over-cap tagged arm.
let eslot: i32 = tupeslotn(pt.lhs);
let eu: *tinfo = we.type_: *tinfo;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
let eoff: i32 = 0;
if (we.kind == nkind.N_IDENT && eu != nil) {
if (eu.kind == tykind.TY_TAGGED && tupeslotn(we) == eslot) {
@@ -33212,9 +33219,9 @@ fn cgreturn(c: *cgen, n: *node) void = {
let forwardtagged: bool = false;
if ((rhs.kind == nkind.N_CALL || rhs.kind == nkind.N_INDEX || rhs.kind == nkind.N_DOT) && rhs.type_ != nil && c.fnret != nil && c.fnret.type_ != nil) {
let ru: *tinfo = rhs.type_: *tinfo;
for (ru != nil && ru.kind == tykind.TY_NAMED) { ru = ru.under; };
ru = tichase(ru);
let fu: *tinfo = c.fnret.type_: *tinfo;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
if (ru != nil && fu != nil && ru.kind == tykind.TY_TAGGED && fu.kind == tykind.TY_TAGGED) {
if (ru == fu) {
forwardtagged = true;
@@ -33259,9 +33266,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
return;
};
let ru38: *tinfo = rhs.type_: *tinfo;
for (ru38 != nil && ru38.kind == tykind.TY_NAMED) {
ru38 = ru38.under;
};
ru38 = tichase(ru38);
if (ru38 != nil) {
// #37 wired the N_INDEX/N_DOT mem-read into
// the widener; the remaining >32B kinds stay
@@ -33851,7 +33856,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
if (rhs.op == tkind.TK_STAR) { arrok = true; };
};
let ati: *tinfo = c.fnret.type_: *tinfo;
for (ati != nil && ati.kind == tykind.TY_NAMED) { ati = ati.under; };
ati = tichase(ati);
if (arrok && ati != nil) {
let rsz: i32 = ati.size: i32;
if (rsz <= 24) {
@@ -33903,7 +33908,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
// elements loud-stop (rule 7, no consumer).
let esubti: *tinfo = nil;
if (ati.sub != nil) { esubti = ati.sub; };
for (esubti != nil && esubti.kind == tykind.TY_NAMED) { esubti = esubti.under; };
esubti = tichase(esubti);
let esz: i32 = 8;
if (esubti != nil) { esz = esubti.size: i32; };
let badel: bool = false;
@@ -34056,7 +34061,7 @@ fn cgreturn(c: *cgen, n: *node) void = {
let aggret: bool = false;
if (c.fnret != nil) {
let rti: *tinfo = c.fnret.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil) {
if (rti.kind == tykind.TY_ARRAY) { aggret = true; };
if (rti.kind == tykind.TY_STRUCT) { aggret = true; };
@@ -34185,9 +34190,7 @@ fn cgarrlitfillbp(c: *cgen, arrtn: *node, rhs: *node, off: i32) void = {
// natural size (cstage esub->size).
let esubti: *tinfo = nil;
if (elemn != nil) { esubti = elemn.type_: *tinfo; };
for (esubti != nil && esubti.kind == tykind.TY_NAMED) {
esubti = esubti.under;
};
esubti = tichase(esubti);
let isagg: bool = esubti != nil
&& (esubti.kind == tykind.TY_STRUCT
|| esubti.kind == tykind.TY_ARRAY
@@ -34504,7 +34507,7 @@ fn cglet(c: *cgen, n: *node) void = {
let nidx: i32 = -1;
let nti: *tinfo = nil;
if (c.fnret != nil) { nti = c.fnret.type_: *tinfo; };
for (nti != nil && nti.kind == tykind.TY_NAMED) { nti = nti.under; };
nti = tichase(nti);
if (nti != nil) { if (nti.kind == tykind.TY_TAGGED) {
let np: *tparam = nti.params;
let nidx2: i32 = 0;
@@ -34560,13 +34563,9 @@ fn cglet(c: *cgen, n: *node) void = {
return;
};
let lru: *tinfo = rhs.type_: *tinfo;
for (lru != nil && lru.kind == tykind.TY_NAMED) {
lru = lru.under;
};
lru = tichase(lru);
let llu: *tinfo = tn.type_: *tinfo;
for (llu != nil && llu.kind == tykind.TY_NAMED) {
llu = llu.under;
};
llu = tichase(llu);
let exact38: bool = false;
if (lru != nil && lru == llu) { exact38 = true; }
else {
@@ -34849,7 +34848,7 @@ fn cglet(c: *cgen, n: *node) void = {
if (rhs.kind == nkind.N_CALL && tn != nil
&& tn.kind == nkind.N_TARRAY) {
let ati: *tinfo = tn.type_: *tinfo;
for (ati != nil && ati.kind == tykind.TY_NAMED) { ati = ati.under; };
ati = tichase(ati);
if (ati != nil) {
let lsz: i32 = ati.size: i32;
let tlm: i32 = lsz - (lsz / 8) * 8;
@@ -34975,9 +34974,7 @@ fn cglet(c: *cgen, n: *node) void = {
} else {
let aggti: *tinfo = nil;
if (tn != nil) { aggti = tn.type_: *tinfo; };
for (aggti != nil && aggti.kind == tykind.TY_NAMED) {
aggti = aggti.under;
};
aggti = tichase(aggti);
if (aggti != nil) {
if (aggti.kind == tykind.TY_ARRAY) {
aggn = aggti.size: i32;
@@ -35032,9 +35029,7 @@ fn cglet(c: *cgen, n: *node) void = {
let idx: *node = rhs.rhs;
let bu: *tinfo = nil;
if (base != nil) { bu = base.type_: *tinfo; };
for (bu != nil && bu.kind == tykind.TY_NAMED) {
bu = bu.under;
};
bu = tichase(bu);
if (base != nil && base.kind == nkind.N_IDENT
&& bu != nil && bu.kind == tykind.TY_ARRAY) {
let esz: i32 = 1;
@@ -35096,9 +35091,7 @@ fn cglet(c: *cgen, n: *node) void = {
let bidx: *node = base.rhs;
let abu: *tinfo = nil;
if (ab != nil) { abu = ab.type_: *tinfo; };
for (abu != nil && abu.kind == tykind.TY_NAMED) {
abu = abu.under;
};
abu = tichase(abu);
if (ab != nil && ab.kind == nkind.N_IDENT
&& abu != nil && abu.kind == tykind.TY_ARRAY) {
let aesz: i32 = 1;
@@ -35310,9 +35303,7 @@ fn cglet(c: *cgen, n: *node) void = {
let szi: *structinfo = structlookupchain(c, n.lhs);
if (szi != nil) {
let ti: *tinfo = n.lhs.type_: *tinfo;
for (ti != nil && ti.kind == tykind.TY_NAMED) {
ti = ti.under;
};
ti = tichase(ti);
if (ti != nil) { zsz = ti.size: i32; };
};
};
@@ -35646,7 +35637,7 @@ fn cgmlet(c: *cgen, n: *node) void = {
let rl: *local = localfindnode(c, rhs.str);
if (rl != nil) {
let rti: *tinfo = rl.tnode.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil) { if (rti.kind == tykind.TY_TUPLE) {
let srcoff: i32 = rl.off;
let foff: i32 = 0;
@@ -35952,7 +35943,7 @@ fn cgforrange(c: *cgen, n: *node) void = {
// synthesis precedent above).
if (slctn == nil && slc != nil) {
let sti2: *tinfo = slc.type_: *tinfo;
for (sti2 != nil && sti2.kind == tykind.TY_NAMED) { sti2 = sti2.under; };
sti2 = tichase(sti2);
if (sti2 != nil) {
if (sti2.kind == tykind.TY_SLICE
|| sti2.kind == tykind.TY_STR
@@ -35988,9 +35979,7 @@ fn cgforrange(c: *cgen, n: *node) void = {
if (slc != nil) {
if (slc.kind != nkind.N_IDENT) {
let stu70: *tinfo = slc.type_: *tinfo;
for (stu70 != nil && stu70.kind == tykind.TY_NAMED) {
stu70 = stu70.under;
};
stu70 = tichase(stu70);
let arr70: bool = false;
if (stu70 != nil) {
if (stu70.kind == tykind.TY_ARRAY) {
@@ -38505,7 +38494,7 @@ fn emitfloatlitdata(c: *cgen, directive: str, name: str, module: str,
fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
base: u64) bool = {
let su: *tinfo = structt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
if (su == nil) { return false; };
if (su.kind != tykind.TY_STRUCT) { return false; };
let pos: u64 = base;
@@ -38541,7 +38530,7 @@ fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
let vr: *node = v;
for (vr != nil && vr.kind == nkind.N_CAST) { vr = vr.lhs; };
let fu: *tinfo = f.type_;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
if (fu != nil && fu.kind == tykind.TY_STRUCT) {
if (vr == nil) {
let m: str = "emitstructlitbytes: nested struct field rhs nil (#129 A.2)\n";
@@ -38658,7 +38647,7 @@ fn emitstructlitbytes(c: *cgen, structt: *tinfo, rhs: *node,
fn emitstructdata(c: *cgen, directive: str, name: str, module: str,
structt: *tinfo, rhs: *node) bool = {
let su: *tinfo = structt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
if (su == nil) { return false; };
if (su.kind != tykind.TY_STRUCT) { return false; };
emitline(directive);
@@ -38691,13 +38680,13 @@ fn emitstructdata(c: *cgen, directive: str, name: str, module: str,
fn emitarraylitbytes(c: *cgen, arrt: *tinfo, rhs: *node,
emit_phase: i32) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
let esz: i32 = au.sub.size: i32;
let alen: i32 = au.alen: i32;
let eu: *tinfo = au.sub;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu != nil && eu.kind == tykind.TY_STRUCT) {
// Validate: every element must be N_STRUCTLIT (after N_CAST).
@@ -38947,11 +38936,11 @@ fn emitarraylitbytes(c: *cgen, arrt: *tinfo, rhs: *node,
fn emitstrarraydata(c: *cgen, directive: str, name: str, module: str,
arrt: *tinfo, rhs: *node) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
let eu: *tinfo = au.sub;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu == nil) { return false; };
if (eu.kind != tykind.TY_STR) { return false; };
if (!streq(directive, "DATAW")) { return false; };
@@ -39065,7 +39054,7 @@ fn emitstrarraydata(c: *cgen, directive: str, name: str, module: str,
fn emitarraydata(c: *cgen, directive: str, name: str, module: str,
arrt: *tinfo, rhs: *node) bool = {
let au: *tinfo = arrt;
for (au != nil && au.kind == tykind.TY_NAMED) { au = au.under; };
au = tichase(au);
if (au == nil) { return false; };
if (au.kind != tykind.TY_ARRAY) { return false; };
if (rhs == nil) {
@@ -39109,7 +39098,7 @@ fn emitarraydata(c: *cgen, directive: str, name: str, module: str,
fn emitslicedata(c: *cgen, name: str, module: str, slt: *tinfo,
rhs: *node) void = {
let su: *tinfo = slt;
for (su != nil && su.kind == tykind.TY_NAMED) { su = su.under; };
su = tichase(su);
// Defensive, mirrors cstage emit_slice_data's
// `if (u == NULL || u->kind != TY_SLICE) return 0` (rule-10): the
// letvarisslice gate already guarantees a slice, so this is
@@ -39118,7 +39107,7 @@ fn emitslicedata(c: *cgen, name: str, module: str, slt: *tinfo,
if (su == nil || su.kind != tykind.TY_SLICE) { return; };
let etype: *tinfo = su.sub;
let eu: *tinfo = etype;
for (eu != nil && eu.kind == tykind.TY_NAMED) { eu = eu.under; };
eu = tichase(eu);
if (eu != nil) {
if (eu.kind == tykind.TY_STR || eu.kind == tykind.TY_SLICE
|| eu.kind == tykind.TY_TAGGED) {
@@ -39238,9 +39227,7 @@ fn emittupledata(c: *cgen, name: str, module: str, tt: *node, rhs: *node) bool =
{
let eti: *tinfo = nil;
if (et != nil) { eti = et.type_: *tinfo; };
for (eti != nil && eti.kind == tykind.TY_NAMED) {
eti = eti.under;
};
eti = tichase(eti);
if (eti != nil && eti.kind == tykind.TY_TAGGED) {
return false;
};
@@ -39647,9 +39634,7 @@ fn emitdefconstants(c: *cgen, file: *node) void = {
if (r != nil) { if (r.kind == nkind.N_STRUCTLIT) {
let st: *tinfo = d.lhs.type_: *tinfo;
let su: *tinfo = st;
for (su != nil && su.kind == tykind.TY_NAMED) {
su = su.under;
};
su = tichase(su);
if (su != nil) {
if (su.kind == tykind.TY_STRUCT) {
emitstructdata(c, "DATA",
@@ -39662,9 +39647,7 @@ fn emitdefconstants(c: *cgen, file: *node) void = {
if (r != nil) { if (r.kind == nkind.N_ARRLIT) {
let at: *tinfo = d.lhs.type_: *tinfo;
let au: *tinfo = at;
for (au != nil && au.kind == tykind.TY_NAMED) {
au = au.under;
};
au = tichase(au);
if (au != nil) {
if (au.kind == tykind.TY_ARRAY) {
emitarraydata(c, "DATA",