wcc_ww/cgen: collapse cgenexpr.ww's plain TY_NAMED chase loops into tichase — byte-id neutral

Mechanical sweep, F2a batch 1 commit 2 (alias arc #5, rob F2 ruling:
one chased accessor is the only spelled way to dealias; this
enumeration seeds the future peellint whitelist). Every loop matching
the exact plain shape

    for (X != nil && X.kind == tykind.TY_NAMED) { X = X.under; };

(modulo variable name and one-line vs three-line layout, body exactly
the peel, guard exactly nil+NAMED) becomes `X = tichase(X);`. Census of
cgenexpr.ww at commit 1: 71 `.under` lines — 49 one-line peels + 21
multi-line-spelled peels, all eyes-classified as the plain shape, all
70 converted (count-asserted).

Survivor enumeration (raw `.under` occurrences left in cgenexpr.ww):
- cgenexpr.ww:2886 — comment text only ("follows the resolved
  NAMED.under pointer"), no code read. Classification: not a read.
Zero code-level raw `.under` reads remain in this file.

Byte-id evidence: pre-sweep w6c_ww (commit-1 build) vs post-sweep
w6c_ww compared over a 31-input corpus — all selfhost/cmd/*/
main.combined.ww (the compiler's own full source) plus the #60/#79
probe set — identical exit codes and byte-identical .s for every
input. make test-unit green (287). combined.ww regens ride along
(cgenexpr.ww is an embedded source).
This commit is contained in:
2026-06-05 19:54:28 +09:00
parent da81a4c86e
commit ef93b1637e
3 changed files with 210 additions and 336 deletions

View File

@@ -21114,7 +21114,7 @@ fn cgtagvariantidx(c: *cgen, tagged: *node, vt: *node) i32 = {
// scrutinee shape, so the AST-keyed -1 here was a silent
// tag-0 clamp on wwstage (cs CMPQ $1 vs ww CMPQ $0).
let sti: *tinfo = tagged.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
if (sti != nil && sti.kind == tykind.TY_TAGGED && vt.type_ != nil) {
return flatvariantidxt(sti, vt.type_: *tinfo);
};
@@ -21141,12 +21141,12 @@ fn cgtagvariantidx(c: *cgen, tagged: *node, vt: *node) i32 = {
fn cgtrytupleshift(c: *cgen, n: *node) bool = {
if (n.lhs == nil) { return false; };
let ou: *tinfo = n.lhs.type_: *tinfo;
for (ou != nil && ou.kind == tykind.TY_NAMED) { ou = ou.under; };
ou = tichase(ou);
if (ou == nil) { return false; };
if (ou.kind != tykind.TY_TAGGED) { return false; };
if (ou.params == nil) { return false; };
let sv: *tinfo = ou.params.type_;
for (sv != nil && sv.kind == tykind.TY_NAMED) { sv = sv.under; };
sv = tichase(sv);
if (sv == nil) { return false; };
if (sv.kind != tykind.TY_TUPLE) { return false; };
cgtaggedtuplepayloadshift(c, sv);
@@ -21164,12 +21164,12 @@ fn cgtrytupleshift(c: *cgen, n: *node) bool = {
fn cgtrytaggedshift(c: *cgen, n: *node) bool = {
if (n.lhs == nil) { return false; };
let ou: *tinfo = n.lhs.type_: *tinfo;
for (ou != nil && ou.kind == tykind.TY_NAMED) { ou = ou.under; };
ou = tichase(ou);
if (ou == nil) { return false; };
if (ou.kind != tykind.TY_TAGGED) { return false; };
if (ou.params == nil) { return false; };
let sv: *tinfo = ou.params.type_;
for (sv != nil && sv.kind == tykind.TY_NAMED) { sv = sv.under; };
sv = tichase(sv);
if (sv == nil) { return false; };
if (sv.kind != tykind.TY_TAGGED) { return false; };
if (sv.nullable != 0) { return false; };
@@ -21189,7 +21189,7 @@ fn cgtrytaggedshift(c: *cgen, n: *node) bool = {
fn cgtryunwcursor(c: *cgen, n: *node, opname: str) void = {
let u: *tinfo = nil;
if (n.lhs != nil) { u = n.lhs.type_: *tinfo; };
for (u != nil && u.kind == tykind.TY_NAMED) { u = u.under; };
u = tichase(u);
let utag: bool = false;
if (u != nil) {
if (u.kind == tykind.TY_TAGGED && u.nullable == 0) {
@@ -21293,10 +21293,10 @@ fn cgtryprop(c: *cgen, n: *node) void = {
// itself → zero instructions, byte-id with the pre-#173 emit.
let u: *tinfo = nil;
if (n.lhs != nil) { u = n.lhs.type_: *tinfo; };
for (u != nil && u.kind == tykind.TY_NAMED) { u = u.under; };
u = tichase(u);
let r: *tinfo = nil;
if (c.fnret != nil) { r = c.fnret.type_: *tinfo; };
for (r != nil && r.kind == tykind.TY_NAMED) { r = r.under; };
r = tichase(r);
if (u != nil && r != nil && r.kind == tykind.TY_TAGGED && u.params != nil) {
let propret: str;
propret.ptr = nil; propret.len = 0;
@@ -21518,9 +21518,7 @@ fn cgtypetest(c: *cgen, n: *node) void = {
// cast source — loud. Mirrors cstage.
{
let icu: *tinfo = lhs.type_: *tinfo;
for (icu != nil && icu.kind == tykind.TY_NAMED) {
icu = icu.under;
};
icu = tichase(icu);
if (lhs.kind == nkind.N_CAST && icu != nil
&& icu.kind == tykind.TY_TAGGED
&& icu.nullable == 0) {
@@ -21711,9 +21709,7 @@ fn cgtypeassert(c: *cgen, n: *node) void = {
// cast source — loud. Mirrors cstage.
{
let acu: *tinfo = lhs.type_: *tinfo;
for (acu != nil && acu.kind == tykind.TY_NAMED) {
acu = acu.under;
};
acu = tichase(acu);
if (lhs.kind == nkind.N_CAST && acu != nil
&& acu.kind == tykind.TY_TAGGED
&& acu.nullable == 0) {
@@ -21937,7 +21933,7 @@ fn cgident(c: *cgen, n: *node) void = {
// just word0 in AX. Mirror of cstage cgexpr N_IDENT tuple arm.
let itu: *tinfo = nil;
if (lc.tnode != nil) { itu = lc.tnode.type_: *tinfo; };
for (itu != nil && itu.kind == tykind.TY_NAMED) { itu = itu.under; };
itu = tichase(itu);
if (itu != nil) { if (itu.kind == tykind.TY_TUPLE) {
cgtupleslottocursor(c, off, itu);
return;
@@ -22189,13 +22185,13 @@ fn dotchainaddr(c: *cgen, n: *node, dstreg: str) bool = {
let x: *node = n.lhs;
if (x == nil) { return false; };
let xu: *tinfo = x.type_: *tinfo;
for (xu != nil && xu.kind == tykind.TY_NAMED) { xu = xu.under; };
xu = tichase(xu);
if (xu == nil) { return false; };
let xviaptr: bool = false;
let st: *tinfo = nil;
if (xu.kind == tykind.TY_PTR) {
let p: *tinfo = xu.sub;
for (p != nil && p.kind == tykind.TY_NAMED) { p = p.under; };
p = tichase(p);
if (p != nil) { if (p.kind == tykind.TY_STRUCT) {
st = p;
xviaptr = true;
@@ -22288,13 +22284,13 @@ fn dotbaseaddr(c: *cgen, base: *node, dstreg: str) bool = {
};
};
let bu: *tinfo = inner.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
let viaptr: bool = false;
let structt: *tinfo = nil;
if (bu.kind == tykind.TY_PTR) {
let st: *tinfo = bu.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
structt = st;
viaptr = true;
@@ -22319,7 +22315,7 @@ fn dotbaseaddr(c: *cgen, base: *node, dstreg: str) bool = {
// the existing cgexpr(base) path correctly loads the pointer/
// header value; over-firing here would skip the deref. Cstage
// twin gate at cg_dotbase_addr.
for (ft != nil && ft.kind == tykind.TY_NAMED) { ft = ft.under; };
ft = tichase(ft);
if (ft == nil) { return false; };
if (ft.kind != tykind.TY_ARRAY) { return false; };
// #253: chained inner — compute the container base via the dot-chain
@@ -22436,7 +22432,7 @@ fn aggargsrcaddr(c: *cgen, src: *node, dst: str) bool = {
if (base == nil) { return false; };
if (base.kind != nkind.N_IDENT) { return false; };
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
if (bu.kind != tykind.TY_ARRAY) { return false; };
let esz: i32 = 1;
@@ -22581,13 +22577,13 @@ fn cgplaceaddr(c: *cgen, n: *node, dstreg: str) bool = {
// enumerated arms never reach the resolver (those arms
// dispatch first), so their asm is untouched.
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
if (bu.kind != tykind.TY_SLICE && bu.kind != tykind.TY_ARRAY) {
return false;
};
let et: *tinfo = n.type_: *tinfo;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
if (et == nil) { return false; };
let esz: i32 = et.size: i32;
cgexpr(c, idx);
@@ -22619,13 +22615,13 @@ fn cgplaceaddr(c: *cgen, n: *node, dstreg: str) bool = {
let base: *node = n.lhs;
if (base == nil) { return false; };
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
let viaptr: bool = false;
let st: *tinfo = nil;
if (bu.kind == tykind.TY_PTR) {
let p: *tinfo = bu.sub;
for (p != nil && p.kind == tykind.TY_NAMED) { p = p.under; };
p = tichase(p);
if (p != nil) { if (p.kind == tykind.TY_STRUCT) {
st = p;
viaptr = true;
@@ -23259,9 +23255,7 @@ fn cgslice(c: *cgen, n: *node) void = {
let dotbu: *tinfo = nil;
if (base != nil) { if (base.kind == nkind.N_DOT) {
dotbu = base.type_: *tinfo;
for (dotbu != nil && dotbu.kind == tykind.TY_NAMED) {
dotbu = dotbu.under;
};
dotbu = tichase(dotbu);
};};
// #31: an N_ARRLIT base (the desugared one-step `let xs:[]T=[..]`
// borrow — the ONLY context that reaches here; call-arg/return/assign
@@ -23590,9 +23584,7 @@ fn cgmatch(c: *cgen, n: *node) void = {
// to match. Surfaced by reviewer-37's `match (*p)`
// probe on a 56B box.
let ms37: *tinfo = scrut.type_: *tinfo;
for (ms37 != nil && ms37.kind == tykind.TY_NAMED) {
ms37 = ms37.under;
};
ms37 = tichase(ms37);
if (ms37 != nil && ms37.kind == tykind.TY_TAGGED
&& ms37.size: i32 > TUPLE_GPCAP * 8) {
let m37n: str = "#37: >32B tagged match scrutinee from a non-mem-based source unwired (rule 7)\n";
@@ -24464,13 +24456,13 @@ fn cgdot(c: *cgen, n: *node) void = {
if (idxbase != nil) { if (idxbase.kind == nkind.N_IDENT) {
let elemt: *tinfo = lhs.type_: *tinfo;
let elemu: *tinfo = elemt;
for (elemu != nil && elemu.kind == tykind.TY_NAMED) { elemu = elemu.under; };
elemu = tichase(elemu);
let st: *tinfo = nil;
let viaptr: bool = false;
if (elemu != nil) {
if (elemu.kind == tykind.TY_PTR) {
let pin: *tinfo = elemu.sub;
for (pin != nil && pin.kind == tykind.TY_NAMED) { pin = pin.under; };
pin = tichase(pin);
if (pin != nil) { if (pin.kind == tykind.TY_STRUCT) {
st = pin;
viaptr = true;
@@ -24487,7 +24479,7 @@ fn cgdot(c: *cgen, n: *node) void = {
fwalk = fwalk.tnext;
};
let bu: *tinfo = idxbase.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
let baseisarray: bool = false;
let baseok: bool = false;
if (bu != nil) {
@@ -24556,7 +24548,7 @@ fn cgdot(c: *cgen, n: *node) void = {
let foff: i64 = fnd.offset: i64;
let ft: *tinfo = fnd.type_;
let fu: *tinfo = ft;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
// #270-1a: an `[N]T`-typed field of an
// array element (`a[i].m[j]`) — leave the
// field's ADDRESS, a base for the outer
@@ -24743,9 +24735,7 @@ fn cgdot(c: *cgen, n: *node) void = {
// registers (ken x5c: o.r.min as size added DX).
if (typeistagged(leaftype)) {
let tlu: *tinfo = leaftype;
for (tlu != nil && tlu.kind == tykind.TY_NAMED) {
tlu = tlu.under;
};
tlu = tichase(tlu);
let ttsz: i32 = tlu.size: i32;
if (viacx) {
if (ptrroot) {
@@ -24899,7 +24889,7 @@ fn cgdot(c: *cgen, n: *node) void = {
{
let pbu: *tinfo = nil;
if (lhs != nil) { pbu = lhs.type_: *tinfo; };
for (pbu != nil && pbu.kind == tykind.TY_NAMED) { pbu = pbu.under; };
pbu = tichase(pbu);
let pbok: bool = false;
if (pbu != nil) {
if (pbu.kind == tykind.TY_SLICE
@@ -24968,11 +24958,11 @@ fn cgdot(c: *cgen, n: *node) void = {
let allptr: bool = true;
for (croot != nil && croot.kind == nkind.N_DOT) {
let ct: *tinfo = croot.type_: *tinfo;
for (ct != nil && ct.kind == tykind.TY_NAMED) { ct = ct.under; };
ct = tichase(ct);
let okp: bool = false;
if (ct != nil) { if (ct.kind == tykind.TY_PTR) {
let cs: *tinfo = ct.sub;
for (cs != nil && cs.kind == tykind.TY_NAMED) { cs = cs.under; };
cs = tichase(cs);
if (cs != nil) { if (cs.kind == tykind.TY_STRUCT) { okp = true; }; };
}; };
if (!okp) { allptr = false; };
@@ -24983,10 +24973,10 @@ fn cgdot(c: *cgen, n: *node) void = {
localfindnode(c, croot.str) != nil) {
it = lhs.type_: *tinfo;
};
for (it != nil && it.kind == tykind.TY_NAMED) { it = it.under; };
it = tichase(it);
if (it != nil) { if (it.kind == tykind.TY_PTR) {
let st: *tinfo = it.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
let tf: *tfield = st.fields;
for (tf != nil) {
@@ -25001,9 +24991,7 @@ fn cgdot(c: *cgen, n: *node) void = {
// scalar tail read stale DX as payload).
if (typeistagged(ft)) {
let plu: *tinfo = ft;
for (plu != nil && plu.kind == tykind.TY_NAMED) {
plu = plu.under;
};
plu = tichase(plu);
emitline("\tMOVQ\tAX, BX\n");
cgloadtaggedfield(c, "BX",
tf.offset: i32,
@@ -25200,7 +25188,7 @@ fn cgdot(c: *cgen, n: *node) void = {
if (lhs != nil) {
if (lhs.kind == nkind.N_DOT) {
let pgu: *tinfo = lhs.type_: *tinfo;
for (pgu != nil && pgu.kind == tykind.TY_NAMED) { pgu = pgu.under; };
pgu = tichase(pgu);
if (pgu != nil) {
if (pgu.kind == tykind.TY_PTR) {
let mp: str = "cgdot: ptr-chained field read unwired in wwstage (task #37)\n";
@@ -25221,7 +25209,7 @@ fn cgdot(c: *cgen, n: *node) void = {
{
let rdt: *tinfo = n.type_: *tinfo;
let rdu: *tinfo = rdt;
for (rdu != nil && rdu.kind == tykind.TY_NAMED) { rdu = rdu.under; };
rdu = tichase(rdu);
if (rdu != nil) {
if (rdu.kind == tykind.TY_TAGGED) {
let mt: str = "read-resolver: tagged field read not wired (rule-7)\n";
@@ -25751,7 +25739,7 @@ fn cgun(c: *cgen, n: *node) void = {
// pulled a[0]'s VALUE and `(*p)[i]` then dereferenced it as
// the index base — a wild pointer, SIGSEGV on both stages.
let rti: *tinfo = n.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil && rti.kind == tykind.TY_FN) { return; };
if (rti != nil && rti.kind == tykind.TY_ARRAY) { return; };
// Family C (#35/#46): a tagged box behind *p joins the
@@ -26280,7 +26268,7 @@ fn cgappend(c: *cgen, n: *node) void = {
// same source cstage reads (sn->type → su->sub->size).
sti = sn.type_: *tinfo;
let fsti: *tinfo = sti;
for (fsti != nil && fsti.kind == tykind.TY_NAMED) { fsti = fsti.under; };
fsti = tichase(fsti);
if (fsti != nil && fsti.sub != nil) { esz = fsti.sub.size: i32; };
if (esz <= 0) {
let m15z: str = "#15: append() target element size unresolved (rule-7)\n";
@@ -26295,16 +26283,14 @@ fn cgappend(c: *cgen, n: *node) void = {
// the value node's literal tinfo is the #25/#31 esz=0 trap.
// Mirrors cstage cgen.c's append arm + the #270/#12/#20
// array-literal element dispatch (cgarrlitfillbp).
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esubti: *tinfo = nil;
if (sti != nil) { esubti = sti.sub; };
// FA1: pre-peel handle — the indirect struct-lit fill keys its
// structinfo off the NAMED element tinfo's name (the same leaf
// structlookupchain resolves from the declared tnode).
let esubnamed: *tinfo = esubti;
for (esubti != nil && esubti.kind == tykind.TY_NAMED) {
esubti = esubti.under;
};
esubti = tichase(esubti);
let elstr: bool = esubti != nil && esubti.kind == tykind.TY_STR;
let elslice: bool = esubti != nil && esubti.kind == tykind.TY_SLICE;
let eltagged: bool = esubti != nil && esubti.kind == tykind.TY_TAGGED;
@@ -26351,7 +26337,7 @@ fn cgappend(c: *cgen, n: *node) void = {
// shares the slice header layout.
let itu: *tinfo = nil;
if (it != nil) { itu = it.type_: *tinfo; };
for (itu != nil && itu.kind == tykind.TY_NAMED) { itu = itu.under; };
itu = tichase(itu);
if (itu == nil || (itu.kind != tykind.TY_SLICE
&& itu.kind != tykind.TY_STR)) {
let m35p: str = "#35: append() spread source shape unsupported (rule-7)\n";
@@ -26586,7 +26572,7 @@ fn cgappend(c: *cgen, n: *node) void = {
let af: *tfield = nil;
if (ab != nil) {
let abu: *tinfo = ab.type_: *tinfo;
for (abu != nil && abu.kind == tykind.TY_NAMED) { abu = abu.under; };
abu = tichase(abu);
if (abu != nil && abu.kind == tykind.TY_STRUCT) {
let fl: *tfield = abu.fields;
for (fl != nil) {
@@ -26602,11 +26588,11 @@ fn cgappend(c: *cgen, n: *node) void = {
if (aok && ch.kind == nkind.N_INDEX) {
let ab: *node = ch.lhs;
let aet: *tinfo = ch.type_: *tinfo;
for (aet != nil && aet.kind == tykind.TY_NAMED) { aet = aet.under; };
aet = tichase(aet);
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 || abu == nil || aet == nil
|| (abu.kind != tykind.TY_SLICE && abu.kind != tykind.TY_ARRAY)) {
@@ -26889,10 +26875,10 @@ fn cgdelete(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -27021,10 +27007,10 @@ fn cgdeleterange(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -27220,10 +27206,10 @@ fn cginsert(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -27537,9 +27523,7 @@ fn cgcall(c: *cgen, n: *node) void = {
let a: *node = n.list;
let at: *tinfo = a.type_: *tinfo;
let u: *tinfo = at;
for (u != nil && u.kind == tykind.TY_NAMED) {
u = u.under;
};
u = tichase(u);
let hdrish: bool = false;
if (u != nil) {
if (u.kind == tykind.TY_SLICE
@@ -28412,9 +28396,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& n.op == tkind.TK_ASSIGN && n.rhs != nil) {
if (n.rhs.kind == nkind.N_STRUCTLIT) {
let iet: *tinfo = lhs.type_: *tinfo;
for (iet != nil && iet.kind == tykind.TY_NAMED) {
iet = iet.under;
};
iet = tichase(iet);
if (iet != nil) {
if (iet.kind == tykind.TY_STRUCT) {
placeslit = true;
@@ -28434,9 +28416,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (lhs.kind == nkind.N_UN && lhs.op == tkind.TK_STAR
&& n.op == tkind.TK_ASSIGN) {
let du: *tinfo = lhs.type_: *tinfo;
for (du != nil && du.kind == tykind.TY_NAMED) {
du = du.under;
};
du = tichase(du);
if (du != nil) {
if (du.kind == tykind.TY_STRUCT
|| du.kind == tykind.TY_ARRAY
@@ -28467,9 +28447,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (n.op == tkind.TK_ASSIGN && lhs != nil && n.rhs != nil) {
if (n.rhs.kind == nkind.N_ARRLIT) {
let alt: *tinfo = lhs.type_: *tinfo;
for (alt != nil && alt.kind == tykind.TY_NAMED) {
alt = alt.under;
};
alt = tichase(alt);
if (alt != nil) {
if (alt.kind == tykind.TY_ARRAY) {
let mal: str = "array-literal store at assignment unwired (task #32)\n";
@@ -28504,13 +28482,9 @@ fn cgassign(c: *cgen, n: *node) void = {
};
if (asret > 0) {
let aru: *tinfo = n.rhs.type_: *tinfo;
for (aru != nil && aru.kind == tykind.TY_NAMED) {
aru = aru.under;
};
aru = tichase(aru);
let alu: *tinfo = lc.tnode.type_: *tinfo;
for (alu != nil && alu.kind == tykind.TY_NAMED) {
alu = alu.under;
};
alu = tichase(alu);
let aexact: bool = false;
if (aru != nil && aru == alu) { aexact = true; }
else {
@@ -28540,9 +28514,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (lc == nil && n.rhs != nil) {
if (n.rhs.kind == nkind.N_CALL) {
let gru: *tinfo = lhs.type_: *tinfo;
for (gru != nil && gru.kind == tykind.TY_NAMED) {
gru = gru.under;
};
gru = tichase(gru);
if (gru != nil && gru.kind == tykind.TY_TAGGED
&& callsretsize(c, n.rhs) > 0) {
let m38g: str = "#38b: sret receive into a tagged GLOBAL lvalue unwired\n";
@@ -30539,11 +30511,11 @@ fn cgassign(c: *cgen, n: *node) void = {
let allptr: bool = true;
for (croot != nil && croot.kind == nkind.N_DOT) {
let ct: *tinfo = croot.type_: *tinfo;
for (ct != nil && ct.kind == tykind.TY_NAMED) { ct = ct.under; };
ct = tichase(ct);
let okp: bool = false;
if (ct != nil) { if (ct.kind == tykind.TY_PTR) {
let cs: *tinfo = ct.sub;
for (cs != nil && cs.kind == tykind.TY_NAMED) { cs = cs.under; };
cs = tichase(cs);
if (cs != nil) { if (cs.kind == tykind.TY_STRUCT) { okp = true; }; };
}; };
if (!okp) { allptr = false; };
@@ -30554,10 +30526,10 @@ fn cgassign(c: *cgen, n: *node) void = {
localfindnode(c, croot.str) != nil) {
it = base.type_: *tinfo;
};
for (it != nil && it.kind == tykind.TY_NAMED) { it = it.under; };
it = tichase(it);
if (it != nil) { if (it.kind == tykind.TY_PTR) {
let st: *tinfo = it.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
let tf: *tfield = st.fields;
for (tf != nil) {
@@ -30574,9 +30546,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// landed in the TAG slot (ken b8).
if (typeistagged(ft)) {
let flu: *tinfo = ft;
for (flu != nil && flu.kind == tykind.TY_NAMED) {
flu = flu.under;
};
flu = tichase(flu);
cgexpr(c, base);
emitline("\tMOVQ\tAX, BX\n");
cgwidentaggedstore(c, flu, n.rhs,
@@ -30801,9 +30771,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// (TK_ASSIGN gate above).
if (typeistagged(leaftype)) {
let wlu: *tinfo = leaftype;
for (wlu != nil && wlu.kind == tykind.TY_NAMED) {
wlu = wlu.under;
};
wlu = tichase(wlu);
let wtsz: i32 = wlu.size: i32;
if (viacx) {
if (ptrroot) {
@@ -30889,9 +30857,7 @@ fn cgassign(c: *cgen, n: *node) void = {
let leafname: str = "";
if (leaftype != nil) {
let lp: *tinfo = leaftype;
for (lp != nil && lp.kind == tykind.TY_NAMED) {
lp = lp.under;
};
lp = tichase(lp);
if (lp != nil) {
if (lp.kind == tykind.TY_STRUCT) { leafstruct = true; };
};
@@ -31366,7 +31332,7 @@ fn cgassign(c: *cgen, n: *node) void = {
};
if (lvftn.kind == nkind.N_TARRAY) {
let gat: *tinfo = lvftn.type_: *tinfo;
for (gat != nil && gat.kind == tykind.TY_NAMED) { gat = gat.under; };
gat = tichase(gat);
if (gat != nil) { gsz = gat.size: i32; };
};
if (gsz > 24) {
@@ -31395,7 +31361,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& lvftn.kind == nkind.N_TARRAY) {
let aggsz: i32 = 0;
let aat: *tinfo = lvftn.type_: *tinfo;
for (aat != nil && aat.kind == tykind.TY_NAMED) { aat = aat.under; };
aat = tichase(aat);
if (aat != nil) { aggsz = aat.size: i32; };
if (aggsz > 0 && aggsz <= 24) {
cgexpr(c, n.rhs);
@@ -31438,9 +31404,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// tail below: one MOVQ AX, g(SB).
if (n.op == tkind.TK_ASSIGN && lvftn != nil) {
let gau: *tinfo = lvftn.type_: *tinfo;
for (gau != nil && gau.kind == tykind.TY_NAMED) {
gau = gau.under;
};
gau = tichase(gau);
if (gau != nil) {
if (gau.kind == tykind.TY_STRUCT
|| gau.kind == tykind.TY_ARRAY
@@ -31749,9 +31713,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& n.rhs != nil && n.rhs.kind == nkind.N_CALL) {
let acati: *tinfo = nil;
if (lcn.tnode != nil) { acati = lcn.tnode.type_: *tinfo; };
for (acati != nil && acati.kind == tykind.TY_NAMED) {
acati = acati.under;
};
acati = tichase(acati);
if (acati != nil && acati.kind == tykind.TY_ARRAY) {
let lcsz: i32 = acati.size: i32;
if (lcsz > 24) {
@@ -31872,9 +31834,7 @@ fn cgassign(c: *cgen, n: *node) void = {
agu = lcn.tnode.type_: *tinfo;
};
};
for (agu != nil && agu.kind == tykind.TY_NAMED) {
agu = agu.under;
};
agu = tichase(agu);
if (agu != nil) {
if (agu.kind == tykind.TY_STRUCT
|| agu.kind == tykind.TY_ARRAY
@@ -32036,9 +31996,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|| (lhs.kind == nkind.N_UN && lhs.op == tkind.TK_STAR)) {
let ft: *tinfo = lhs.type_: *tinfo;
let fu: *tinfo = ft;
for (fu != nil && fu.kind == tykind.TY_NAMED) {
fu = fu.under;
};
fu = tichase(fu);
let fsz: i32 = 8;
if (ft != nil) { fsz = ft.size: i32; };
if (typeisfloat(ft)) {

View File

@@ -144,7 +144,7 @@ fn cgtagvariantidx(c: *cgen, tagged: *node, vt: *node) i32 = {
// scrutinee shape, so the AST-keyed -1 here was a silent
// tag-0 clamp on wwstage (cs CMPQ $1 vs ww CMPQ $0).
let sti: *tinfo = tagged.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
if (sti != nil && sti.kind == tykind.TY_TAGGED && vt.type_ != nil) {
return flatvariantidxt(sti, vt.type_: *tinfo);
};
@@ -171,12 +171,12 @@ fn cgtagvariantidx(c: *cgen, tagged: *node, vt: *node) i32 = {
fn cgtrytupleshift(c: *cgen, n: *node) bool = {
if (n.lhs == nil) { return false; };
let ou: *tinfo = n.lhs.type_: *tinfo;
for (ou != nil && ou.kind == tykind.TY_NAMED) { ou = ou.under; };
ou = tichase(ou);
if (ou == nil) { return false; };
if (ou.kind != tykind.TY_TAGGED) { return false; };
if (ou.params == nil) { return false; };
let sv: *tinfo = ou.params.type_;
for (sv != nil && sv.kind == tykind.TY_NAMED) { sv = sv.under; };
sv = tichase(sv);
if (sv == nil) { return false; };
if (sv.kind != tykind.TY_TUPLE) { return false; };
cgtaggedtuplepayloadshift(c, sv);
@@ -194,12 +194,12 @@ fn cgtrytupleshift(c: *cgen, n: *node) bool = {
fn cgtrytaggedshift(c: *cgen, n: *node) bool = {
if (n.lhs == nil) { return false; };
let ou: *tinfo = n.lhs.type_: *tinfo;
for (ou != nil && ou.kind == tykind.TY_NAMED) { ou = ou.under; };
ou = tichase(ou);
if (ou == nil) { return false; };
if (ou.kind != tykind.TY_TAGGED) { return false; };
if (ou.params == nil) { return false; };
let sv: *tinfo = ou.params.type_;
for (sv != nil && sv.kind == tykind.TY_NAMED) { sv = sv.under; };
sv = tichase(sv);
if (sv == nil) { return false; };
if (sv.kind != tykind.TY_TAGGED) { return false; };
if (sv.nullable != 0) { return false; };
@@ -219,7 +219,7 @@ fn cgtrytaggedshift(c: *cgen, n: *node) bool = {
fn cgtryunwcursor(c: *cgen, n: *node, opname: str) void = {
let u: *tinfo = nil;
if (n.lhs != nil) { u = n.lhs.type_: *tinfo; };
for (u != nil && u.kind == tykind.TY_NAMED) { u = u.under; };
u = tichase(u);
let utag: bool = false;
if (u != nil) {
if (u.kind == tykind.TY_TAGGED && u.nullable == 0) {
@@ -323,10 +323,10 @@ fn cgtryprop(c: *cgen, n: *node) void = {
// itself → zero instructions, byte-id with the pre-#173 emit.
let u: *tinfo = nil;
if (n.lhs != nil) { u = n.lhs.type_: *tinfo; };
for (u != nil && u.kind == tykind.TY_NAMED) { u = u.under; };
u = tichase(u);
let r: *tinfo = nil;
if (c.fnret != nil) { r = c.fnret.type_: *tinfo; };
for (r != nil && r.kind == tykind.TY_NAMED) { r = r.under; };
r = tichase(r);
if (u != nil && r != nil && r.kind == tykind.TY_TAGGED && u.params != nil) {
let propret: str;
propret.ptr = nil; propret.len = 0;
@@ -548,9 +548,7 @@ fn cgtypetest(c: *cgen, n: *node) void = {
// cast source — loud. Mirrors cstage.
{
let icu: *tinfo = lhs.type_: *tinfo;
for (icu != nil && icu.kind == tykind.TY_NAMED) {
icu = icu.under;
};
icu = tichase(icu);
if (lhs.kind == nkind.N_CAST && icu != nil
&& icu.kind == tykind.TY_TAGGED
&& icu.nullable == 0) {
@@ -741,9 +739,7 @@ fn cgtypeassert(c: *cgen, n: *node) void = {
// cast source — loud. Mirrors cstage.
{
let acu: *tinfo = lhs.type_: *tinfo;
for (acu != nil && acu.kind == tykind.TY_NAMED) {
acu = acu.under;
};
acu = tichase(acu);
if (lhs.kind == nkind.N_CAST && acu != nil
&& acu.kind == tykind.TY_TAGGED
&& acu.nullable == 0) {
@@ -967,7 +963,7 @@ fn cgident(c: *cgen, n: *node) void = {
// just word0 in AX. Mirror of cstage cgexpr N_IDENT tuple arm.
let itu: *tinfo = nil;
if (lc.tnode != nil) { itu = lc.tnode.type_: *tinfo; };
for (itu != nil && itu.kind == tykind.TY_NAMED) { itu = itu.under; };
itu = tichase(itu);
if (itu != nil) { if (itu.kind == tykind.TY_TUPLE) {
cgtupleslottocursor(c, off, itu);
return;
@@ -1219,13 +1215,13 @@ fn dotchainaddr(c: *cgen, n: *node, dstreg: str) bool = {
let x: *node = n.lhs;
if (x == nil) { return false; };
let xu: *tinfo = x.type_: *tinfo;
for (xu != nil && xu.kind == tykind.TY_NAMED) { xu = xu.under; };
xu = tichase(xu);
if (xu == nil) { return false; };
let xviaptr: bool = false;
let st: *tinfo = nil;
if (xu.kind == tykind.TY_PTR) {
let p: *tinfo = xu.sub;
for (p != nil && p.kind == tykind.TY_NAMED) { p = p.under; };
p = tichase(p);
if (p != nil) { if (p.kind == tykind.TY_STRUCT) {
st = p;
xviaptr = true;
@@ -1318,13 +1314,13 @@ fn dotbaseaddr(c: *cgen, base: *node, dstreg: str) bool = {
};
};
let bu: *tinfo = inner.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
let viaptr: bool = false;
let structt: *tinfo = nil;
if (bu.kind == tykind.TY_PTR) {
let st: *tinfo = bu.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
structt = st;
viaptr = true;
@@ -1349,7 +1345,7 @@ fn dotbaseaddr(c: *cgen, base: *node, dstreg: str) bool = {
// the existing cgexpr(base) path correctly loads the pointer/
// header value; over-firing here would skip the deref. Cstage
// twin gate at cg_dotbase_addr.
for (ft != nil && ft.kind == tykind.TY_NAMED) { ft = ft.under; };
ft = tichase(ft);
if (ft == nil) { return false; };
if (ft.kind != tykind.TY_ARRAY) { return false; };
// #253: chained inner — compute the container base via the dot-chain
@@ -1466,7 +1462,7 @@ fn aggargsrcaddr(c: *cgen, src: *node, dst: str) bool = {
if (base == nil) { return false; };
if (base.kind != nkind.N_IDENT) { return false; };
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
if (bu.kind != tykind.TY_ARRAY) { return false; };
let esz: i32 = 1;
@@ -1611,13 +1607,13 @@ fn cgplaceaddr(c: *cgen, n: *node, dstreg: str) bool = {
// enumerated arms never reach the resolver (those arms
// dispatch first), so their asm is untouched.
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
if (bu.kind != tykind.TY_SLICE && bu.kind != tykind.TY_ARRAY) {
return false;
};
let et: *tinfo = n.type_: *tinfo;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
if (et == nil) { return false; };
let esz: i32 = et.size: i32;
cgexpr(c, idx);
@@ -1649,13 +1645,13 @@ fn cgplaceaddr(c: *cgen, n: *node, dstreg: str) bool = {
let base: *node = n.lhs;
if (base == nil) { return false; };
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
let viaptr: bool = false;
let st: *tinfo = nil;
if (bu.kind == tykind.TY_PTR) {
let p: *tinfo = bu.sub;
for (p != nil && p.kind == tykind.TY_NAMED) { p = p.under; };
p = tichase(p);
if (p != nil) { if (p.kind == tykind.TY_STRUCT) {
st = p;
viaptr = true;
@@ -2289,9 +2285,7 @@ fn cgslice(c: *cgen, n: *node) void = {
let dotbu: *tinfo = nil;
if (base != nil) { if (base.kind == nkind.N_DOT) {
dotbu = base.type_: *tinfo;
for (dotbu != nil && dotbu.kind == tykind.TY_NAMED) {
dotbu = dotbu.under;
};
dotbu = tichase(dotbu);
};};
// #31: an N_ARRLIT base (the desugared one-step `let xs:[]T=[..]`
// borrow — the ONLY context that reaches here; call-arg/return/assign
@@ -2620,9 +2614,7 @@ fn cgmatch(c: *cgen, n: *node) void = {
// to match. Surfaced by reviewer-37's `match (*p)`
// probe on a 56B box.
let ms37: *tinfo = scrut.type_: *tinfo;
for (ms37 != nil && ms37.kind == tykind.TY_NAMED) {
ms37 = ms37.under;
};
ms37 = tichase(ms37);
if (ms37 != nil && ms37.kind == tykind.TY_TAGGED
&& ms37.size: i32 > TUPLE_GPCAP * 8) {
let m37n: str = "#37: >32B tagged match scrutinee from a non-mem-based source unwired (rule 7)\n";
@@ -3494,13 +3486,13 @@ fn cgdot(c: *cgen, n: *node) void = {
if (idxbase != nil) { if (idxbase.kind == nkind.N_IDENT) {
let elemt: *tinfo = lhs.type_: *tinfo;
let elemu: *tinfo = elemt;
for (elemu != nil && elemu.kind == tykind.TY_NAMED) { elemu = elemu.under; };
elemu = tichase(elemu);
let st: *tinfo = nil;
let viaptr: bool = false;
if (elemu != nil) {
if (elemu.kind == tykind.TY_PTR) {
let pin: *tinfo = elemu.sub;
for (pin != nil && pin.kind == tykind.TY_NAMED) { pin = pin.under; };
pin = tichase(pin);
if (pin != nil) { if (pin.kind == tykind.TY_STRUCT) {
st = pin;
viaptr = true;
@@ -3517,7 +3509,7 @@ fn cgdot(c: *cgen, n: *node) void = {
fwalk = fwalk.tnext;
};
let bu: *tinfo = idxbase.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
let baseisarray: bool = false;
let baseok: bool = false;
if (bu != nil) {
@@ -3586,7 +3578,7 @@ fn cgdot(c: *cgen, n: *node) void = {
let foff: i64 = fnd.offset: i64;
let ft: *tinfo = fnd.type_;
let fu: *tinfo = ft;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
// #270-1a: an `[N]T`-typed field of an
// array element (`a[i].m[j]`) — leave the
// field's ADDRESS, a base for the outer
@@ -3773,9 +3765,7 @@ fn cgdot(c: *cgen, n: *node) void = {
// registers (ken x5c: o.r.min as size added DX).
if (typeistagged(leaftype)) {
let tlu: *tinfo = leaftype;
for (tlu != nil && tlu.kind == tykind.TY_NAMED) {
tlu = tlu.under;
};
tlu = tichase(tlu);
let ttsz: i32 = tlu.size: i32;
if (viacx) {
if (ptrroot) {
@@ -3929,7 +3919,7 @@ fn cgdot(c: *cgen, n: *node) void = {
{
let pbu: *tinfo = nil;
if (lhs != nil) { pbu = lhs.type_: *tinfo; };
for (pbu != nil && pbu.kind == tykind.TY_NAMED) { pbu = pbu.under; };
pbu = tichase(pbu);
let pbok: bool = false;
if (pbu != nil) {
if (pbu.kind == tykind.TY_SLICE
@@ -3998,11 +3988,11 @@ fn cgdot(c: *cgen, n: *node) void = {
let allptr: bool = true;
for (croot != nil && croot.kind == nkind.N_DOT) {
let ct: *tinfo = croot.type_: *tinfo;
for (ct != nil && ct.kind == tykind.TY_NAMED) { ct = ct.under; };
ct = tichase(ct);
let okp: bool = false;
if (ct != nil) { if (ct.kind == tykind.TY_PTR) {
let cs: *tinfo = ct.sub;
for (cs != nil && cs.kind == tykind.TY_NAMED) { cs = cs.under; };
cs = tichase(cs);
if (cs != nil) { if (cs.kind == tykind.TY_STRUCT) { okp = true; }; };
}; };
if (!okp) { allptr = false; };
@@ -4013,10 +4003,10 @@ fn cgdot(c: *cgen, n: *node) void = {
localfindnode(c, croot.str) != nil) {
it = lhs.type_: *tinfo;
};
for (it != nil && it.kind == tykind.TY_NAMED) { it = it.under; };
it = tichase(it);
if (it != nil) { if (it.kind == tykind.TY_PTR) {
let st: *tinfo = it.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
let tf: *tfield = st.fields;
for (tf != nil) {
@@ -4031,9 +4021,7 @@ fn cgdot(c: *cgen, n: *node) void = {
// scalar tail read stale DX as payload).
if (typeistagged(ft)) {
let plu: *tinfo = ft;
for (plu != nil && plu.kind == tykind.TY_NAMED) {
plu = plu.under;
};
plu = tichase(plu);
emitline("\tMOVQ\tAX, BX\n");
cgloadtaggedfield(c, "BX",
tf.offset: i32,
@@ -4230,7 +4218,7 @@ fn cgdot(c: *cgen, n: *node) void = {
if (lhs != nil) {
if (lhs.kind == nkind.N_DOT) {
let pgu: *tinfo = lhs.type_: *tinfo;
for (pgu != nil && pgu.kind == tykind.TY_NAMED) { pgu = pgu.under; };
pgu = tichase(pgu);
if (pgu != nil) {
if (pgu.kind == tykind.TY_PTR) {
let mp: str = "cgdot: ptr-chained field read unwired in wwstage (task #37)\n";
@@ -4251,7 +4239,7 @@ fn cgdot(c: *cgen, n: *node) void = {
{
let rdt: *tinfo = n.type_: *tinfo;
let rdu: *tinfo = rdt;
for (rdu != nil && rdu.kind == tykind.TY_NAMED) { rdu = rdu.under; };
rdu = tichase(rdu);
if (rdu != nil) {
if (rdu.kind == tykind.TY_TAGGED) {
let mt: str = "read-resolver: tagged field read not wired (rule-7)\n";
@@ -4781,7 +4769,7 @@ fn cgun(c: *cgen, n: *node) void = {
// pulled a[0]'s VALUE and `(*p)[i]` then dereferenced it as
// the index base — a wild pointer, SIGSEGV on both stages.
let rti: *tinfo = n.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil && rti.kind == tykind.TY_FN) { return; };
if (rti != nil && rti.kind == tykind.TY_ARRAY) { return; };
// Family C (#35/#46): a tagged box behind *p joins the
@@ -5310,7 +5298,7 @@ fn cgappend(c: *cgen, n: *node) void = {
// same source cstage reads (sn->type → su->sub->size).
sti = sn.type_: *tinfo;
let fsti: *tinfo = sti;
for (fsti != nil && fsti.kind == tykind.TY_NAMED) { fsti = fsti.under; };
fsti = tichase(fsti);
if (fsti != nil && fsti.sub != nil) { esz = fsti.sub.size: i32; };
if (esz <= 0) {
let m15z: str = "#15: append() target element size unresolved (rule-7)\n";
@@ -5325,16 +5313,14 @@ fn cgappend(c: *cgen, n: *node) void = {
// the value node's literal tinfo is the #25/#31 esz=0 trap.
// Mirrors cstage cgen.c's append arm + the #270/#12/#20
// array-literal element dispatch (cgarrlitfillbp).
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esubti: *tinfo = nil;
if (sti != nil) { esubti = sti.sub; };
// FA1: pre-peel handle — the indirect struct-lit fill keys its
// structinfo off the NAMED element tinfo's name (the same leaf
// structlookupchain resolves from the declared tnode).
let esubnamed: *tinfo = esubti;
for (esubti != nil && esubti.kind == tykind.TY_NAMED) {
esubti = esubti.under;
};
esubti = tichase(esubti);
let elstr: bool = esubti != nil && esubti.kind == tykind.TY_STR;
let elslice: bool = esubti != nil && esubti.kind == tykind.TY_SLICE;
let eltagged: bool = esubti != nil && esubti.kind == tykind.TY_TAGGED;
@@ -5381,7 +5367,7 @@ fn cgappend(c: *cgen, n: *node) void = {
// shares the slice header layout.
let itu: *tinfo = nil;
if (it != nil) { itu = it.type_: *tinfo; };
for (itu != nil && itu.kind == tykind.TY_NAMED) { itu = itu.under; };
itu = tichase(itu);
if (itu == nil || (itu.kind != tykind.TY_SLICE
&& itu.kind != tykind.TY_STR)) {
let m35p: str = "#35: append() spread source shape unsupported (rule-7)\n";
@@ -5616,7 +5602,7 @@ fn cgappend(c: *cgen, n: *node) void = {
let af: *tfield = nil;
if (ab != nil) {
let abu: *tinfo = ab.type_: *tinfo;
for (abu != nil && abu.kind == tykind.TY_NAMED) { abu = abu.under; };
abu = tichase(abu);
if (abu != nil && abu.kind == tykind.TY_STRUCT) {
let fl: *tfield = abu.fields;
for (fl != nil) {
@@ -5632,11 +5618,11 @@ fn cgappend(c: *cgen, n: *node) void = {
if (aok && ch.kind == nkind.N_INDEX) {
let ab: *node = ch.lhs;
let aet: *tinfo = ch.type_: *tinfo;
for (aet != nil && aet.kind == tykind.TY_NAMED) { aet = aet.under; };
aet = tichase(aet);
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 || abu == nil || aet == nil
|| (abu.kind != tykind.TY_SLICE && abu.kind != tykind.TY_ARRAY)) {
@@ -5919,10 +5905,10 @@ fn cgdelete(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -6051,10 +6037,10 @@ fn cgdeleterange(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -6250,10 +6236,10 @@ fn cginsert(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -6567,9 +6553,7 @@ fn cgcall(c: *cgen, n: *node) void = {
let a: *node = n.list;
let at: *tinfo = a.type_: *tinfo;
let u: *tinfo = at;
for (u != nil && u.kind == tykind.TY_NAMED) {
u = u.under;
};
u = tichase(u);
let hdrish: bool = false;
if (u != nil) {
if (u.kind == tykind.TY_SLICE
@@ -7442,9 +7426,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& n.op == tkind.TK_ASSIGN && n.rhs != nil) {
if (n.rhs.kind == nkind.N_STRUCTLIT) {
let iet: *tinfo = lhs.type_: *tinfo;
for (iet != nil && iet.kind == tykind.TY_NAMED) {
iet = iet.under;
};
iet = tichase(iet);
if (iet != nil) {
if (iet.kind == tykind.TY_STRUCT) {
placeslit = true;
@@ -7464,9 +7446,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (lhs.kind == nkind.N_UN && lhs.op == tkind.TK_STAR
&& n.op == tkind.TK_ASSIGN) {
let du: *tinfo = lhs.type_: *tinfo;
for (du != nil && du.kind == tykind.TY_NAMED) {
du = du.under;
};
du = tichase(du);
if (du != nil) {
if (du.kind == tykind.TY_STRUCT
|| du.kind == tykind.TY_ARRAY
@@ -7497,9 +7477,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (n.op == tkind.TK_ASSIGN && lhs != nil && n.rhs != nil) {
if (n.rhs.kind == nkind.N_ARRLIT) {
let alt: *tinfo = lhs.type_: *tinfo;
for (alt != nil && alt.kind == tykind.TY_NAMED) {
alt = alt.under;
};
alt = tichase(alt);
if (alt != nil) {
if (alt.kind == tykind.TY_ARRAY) {
let mal: str = "array-literal store at assignment unwired (task #32)\n";
@@ -7534,13 +7512,9 @@ fn cgassign(c: *cgen, n: *node) void = {
};
if (asret > 0) {
let aru: *tinfo = n.rhs.type_: *tinfo;
for (aru != nil && aru.kind == tykind.TY_NAMED) {
aru = aru.under;
};
aru = tichase(aru);
let alu: *tinfo = lc.tnode.type_: *tinfo;
for (alu != nil && alu.kind == tykind.TY_NAMED) {
alu = alu.under;
};
alu = tichase(alu);
let aexact: bool = false;
if (aru != nil && aru == alu) { aexact = true; }
else {
@@ -7570,9 +7544,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (lc == nil && n.rhs != nil) {
if (n.rhs.kind == nkind.N_CALL) {
let gru: *tinfo = lhs.type_: *tinfo;
for (gru != nil && gru.kind == tykind.TY_NAMED) {
gru = gru.under;
};
gru = tichase(gru);
if (gru != nil && gru.kind == tykind.TY_TAGGED
&& callsretsize(c, n.rhs) > 0) {
let m38g: str = "#38b: sret receive into a tagged GLOBAL lvalue unwired\n";
@@ -9569,11 +9541,11 @@ fn cgassign(c: *cgen, n: *node) void = {
let allptr: bool = true;
for (croot != nil && croot.kind == nkind.N_DOT) {
let ct: *tinfo = croot.type_: *tinfo;
for (ct != nil && ct.kind == tykind.TY_NAMED) { ct = ct.under; };
ct = tichase(ct);
let okp: bool = false;
if (ct != nil) { if (ct.kind == tykind.TY_PTR) {
let cs: *tinfo = ct.sub;
for (cs != nil && cs.kind == tykind.TY_NAMED) { cs = cs.under; };
cs = tichase(cs);
if (cs != nil) { if (cs.kind == tykind.TY_STRUCT) { okp = true; }; };
}; };
if (!okp) { allptr = false; };
@@ -9584,10 +9556,10 @@ fn cgassign(c: *cgen, n: *node) void = {
localfindnode(c, croot.str) != nil) {
it = base.type_: *tinfo;
};
for (it != nil && it.kind == tykind.TY_NAMED) { it = it.under; };
it = tichase(it);
if (it != nil) { if (it.kind == tykind.TY_PTR) {
let st: *tinfo = it.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
let tf: *tfield = st.fields;
for (tf != nil) {
@@ -9604,9 +9576,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// landed in the TAG slot (ken b8).
if (typeistagged(ft)) {
let flu: *tinfo = ft;
for (flu != nil && flu.kind == tykind.TY_NAMED) {
flu = flu.under;
};
flu = tichase(flu);
cgexpr(c, base);
emitline("\tMOVQ\tAX, BX\n");
cgwidentaggedstore(c, flu, n.rhs,
@@ -9831,9 +9801,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// (TK_ASSIGN gate above).
if (typeistagged(leaftype)) {
let wlu: *tinfo = leaftype;
for (wlu != nil && wlu.kind == tykind.TY_NAMED) {
wlu = wlu.under;
};
wlu = tichase(wlu);
let wtsz: i32 = wlu.size: i32;
if (viacx) {
if (ptrroot) {
@@ -9919,9 +9887,7 @@ fn cgassign(c: *cgen, n: *node) void = {
let leafname: str = "";
if (leaftype != nil) {
let lp: *tinfo = leaftype;
for (lp != nil && lp.kind == tykind.TY_NAMED) {
lp = lp.under;
};
lp = tichase(lp);
if (lp != nil) {
if (lp.kind == tykind.TY_STRUCT) { leafstruct = true; };
};
@@ -10396,7 +10362,7 @@ fn cgassign(c: *cgen, n: *node) void = {
};
if (lvftn.kind == nkind.N_TARRAY) {
let gat: *tinfo = lvftn.type_: *tinfo;
for (gat != nil && gat.kind == tykind.TY_NAMED) { gat = gat.under; };
gat = tichase(gat);
if (gat != nil) { gsz = gat.size: i32; };
};
if (gsz > 24) {
@@ -10425,7 +10391,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& lvftn.kind == nkind.N_TARRAY) {
let aggsz: i32 = 0;
let aat: *tinfo = lvftn.type_: *tinfo;
for (aat != nil && aat.kind == tykind.TY_NAMED) { aat = aat.under; };
aat = tichase(aat);
if (aat != nil) { aggsz = aat.size: i32; };
if (aggsz > 0 && aggsz <= 24) {
cgexpr(c, n.rhs);
@@ -10468,9 +10434,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// tail below: one MOVQ AX, g(SB).
if (n.op == tkind.TK_ASSIGN && lvftn != nil) {
let gau: *tinfo = lvftn.type_: *tinfo;
for (gau != nil && gau.kind == tykind.TY_NAMED) {
gau = gau.under;
};
gau = tichase(gau);
if (gau != nil) {
if (gau.kind == tykind.TY_STRUCT
|| gau.kind == tykind.TY_ARRAY
@@ -10779,9 +10743,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& n.rhs != nil && n.rhs.kind == nkind.N_CALL) {
let acati: *tinfo = nil;
if (lcn.tnode != nil) { acati = lcn.tnode.type_: *tinfo; };
for (acati != nil && acati.kind == tykind.TY_NAMED) {
acati = acati.under;
};
acati = tichase(acati);
if (acati != nil && acati.kind == tykind.TY_ARRAY) {
let lcsz: i32 = acati.size: i32;
if (lcsz > 24) {
@@ -10902,9 +10864,7 @@ fn cgassign(c: *cgen, n: *node) void = {
agu = lcn.tnode.type_: *tinfo;
};
};
for (agu != nil && agu.kind == tykind.TY_NAMED) {
agu = agu.under;
};
agu = tichase(agu);
if (agu != nil) {
if (agu.kind == tykind.TY_STRUCT
|| agu.kind == tykind.TY_ARRAY
@@ -11066,9 +11026,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|| (lhs.kind == nkind.N_UN && lhs.op == tkind.TK_STAR)) {
let ft: *tinfo = lhs.type_: *tinfo;
let fu: *tinfo = ft;
for (fu != nil && fu.kind == tykind.TY_NAMED) {
fu = fu.under;
};
fu = tichase(fu);
let fsz: i32 = 8;
if (ft != nil) { fsz = ft.size: i32; };
if (typeisfloat(ft)) {

View File

@@ -21114,7 +21114,7 @@ fn cgtagvariantidx(c: *cgen, tagged: *node, vt: *node) i32 = {
// scrutinee shape, so the AST-keyed -1 here was a silent
// tag-0 clamp on wwstage (cs CMPQ $1 vs ww CMPQ $0).
let sti: *tinfo = tagged.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
if (sti != nil && sti.kind == tykind.TY_TAGGED && vt.type_ != nil) {
return flatvariantidxt(sti, vt.type_: *tinfo);
};
@@ -21141,12 +21141,12 @@ fn cgtagvariantidx(c: *cgen, tagged: *node, vt: *node) i32 = {
fn cgtrytupleshift(c: *cgen, n: *node) bool = {
if (n.lhs == nil) { return false; };
let ou: *tinfo = n.lhs.type_: *tinfo;
for (ou != nil && ou.kind == tykind.TY_NAMED) { ou = ou.under; };
ou = tichase(ou);
if (ou == nil) { return false; };
if (ou.kind != tykind.TY_TAGGED) { return false; };
if (ou.params == nil) { return false; };
let sv: *tinfo = ou.params.type_;
for (sv != nil && sv.kind == tykind.TY_NAMED) { sv = sv.under; };
sv = tichase(sv);
if (sv == nil) { return false; };
if (sv.kind != tykind.TY_TUPLE) { return false; };
cgtaggedtuplepayloadshift(c, sv);
@@ -21164,12 +21164,12 @@ fn cgtrytupleshift(c: *cgen, n: *node) bool = {
fn cgtrytaggedshift(c: *cgen, n: *node) bool = {
if (n.lhs == nil) { return false; };
let ou: *tinfo = n.lhs.type_: *tinfo;
for (ou != nil && ou.kind == tykind.TY_NAMED) { ou = ou.under; };
ou = tichase(ou);
if (ou == nil) { return false; };
if (ou.kind != tykind.TY_TAGGED) { return false; };
if (ou.params == nil) { return false; };
let sv: *tinfo = ou.params.type_;
for (sv != nil && sv.kind == tykind.TY_NAMED) { sv = sv.under; };
sv = tichase(sv);
if (sv == nil) { return false; };
if (sv.kind != tykind.TY_TAGGED) { return false; };
if (sv.nullable != 0) { return false; };
@@ -21189,7 +21189,7 @@ fn cgtrytaggedshift(c: *cgen, n: *node) bool = {
fn cgtryunwcursor(c: *cgen, n: *node, opname: str) void = {
let u: *tinfo = nil;
if (n.lhs != nil) { u = n.lhs.type_: *tinfo; };
for (u != nil && u.kind == tykind.TY_NAMED) { u = u.under; };
u = tichase(u);
let utag: bool = false;
if (u != nil) {
if (u.kind == tykind.TY_TAGGED && u.nullable == 0) {
@@ -21293,10 +21293,10 @@ fn cgtryprop(c: *cgen, n: *node) void = {
// itself → zero instructions, byte-id with the pre-#173 emit.
let u: *tinfo = nil;
if (n.lhs != nil) { u = n.lhs.type_: *tinfo; };
for (u != nil && u.kind == tykind.TY_NAMED) { u = u.under; };
u = tichase(u);
let r: *tinfo = nil;
if (c.fnret != nil) { r = c.fnret.type_: *tinfo; };
for (r != nil && r.kind == tykind.TY_NAMED) { r = r.under; };
r = tichase(r);
if (u != nil && r != nil && r.kind == tykind.TY_TAGGED && u.params != nil) {
let propret: str;
propret.ptr = nil; propret.len = 0;
@@ -21518,9 +21518,7 @@ fn cgtypetest(c: *cgen, n: *node) void = {
// cast source — loud. Mirrors cstage.
{
let icu: *tinfo = lhs.type_: *tinfo;
for (icu != nil && icu.kind == tykind.TY_NAMED) {
icu = icu.under;
};
icu = tichase(icu);
if (lhs.kind == nkind.N_CAST && icu != nil
&& icu.kind == tykind.TY_TAGGED
&& icu.nullable == 0) {
@@ -21711,9 +21709,7 @@ fn cgtypeassert(c: *cgen, n: *node) void = {
// cast source — loud. Mirrors cstage.
{
let acu: *tinfo = lhs.type_: *tinfo;
for (acu != nil && acu.kind == tykind.TY_NAMED) {
acu = acu.under;
};
acu = tichase(acu);
if (lhs.kind == nkind.N_CAST && acu != nil
&& acu.kind == tykind.TY_TAGGED
&& acu.nullable == 0) {
@@ -21937,7 +21933,7 @@ fn cgident(c: *cgen, n: *node) void = {
// just word0 in AX. Mirror of cstage cgexpr N_IDENT tuple arm.
let itu: *tinfo = nil;
if (lc.tnode != nil) { itu = lc.tnode.type_: *tinfo; };
for (itu != nil && itu.kind == tykind.TY_NAMED) { itu = itu.under; };
itu = tichase(itu);
if (itu != nil) { if (itu.kind == tykind.TY_TUPLE) {
cgtupleslottocursor(c, off, itu);
return;
@@ -22189,13 +22185,13 @@ fn dotchainaddr(c: *cgen, n: *node, dstreg: str) bool = {
let x: *node = n.lhs;
if (x == nil) { return false; };
let xu: *tinfo = x.type_: *tinfo;
for (xu != nil && xu.kind == tykind.TY_NAMED) { xu = xu.under; };
xu = tichase(xu);
if (xu == nil) { return false; };
let xviaptr: bool = false;
let st: *tinfo = nil;
if (xu.kind == tykind.TY_PTR) {
let p: *tinfo = xu.sub;
for (p != nil && p.kind == tykind.TY_NAMED) { p = p.under; };
p = tichase(p);
if (p != nil) { if (p.kind == tykind.TY_STRUCT) {
st = p;
xviaptr = true;
@@ -22288,13 +22284,13 @@ fn dotbaseaddr(c: *cgen, base: *node, dstreg: str) bool = {
};
};
let bu: *tinfo = inner.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
let viaptr: bool = false;
let structt: *tinfo = nil;
if (bu.kind == tykind.TY_PTR) {
let st: *tinfo = bu.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
structt = st;
viaptr = true;
@@ -22319,7 +22315,7 @@ fn dotbaseaddr(c: *cgen, base: *node, dstreg: str) bool = {
// the existing cgexpr(base) path correctly loads the pointer/
// header value; over-firing here would skip the deref. Cstage
// twin gate at cg_dotbase_addr.
for (ft != nil && ft.kind == tykind.TY_NAMED) { ft = ft.under; };
ft = tichase(ft);
if (ft == nil) { return false; };
if (ft.kind != tykind.TY_ARRAY) { return false; };
// #253: chained inner — compute the container base via the dot-chain
@@ -22436,7 +22432,7 @@ fn aggargsrcaddr(c: *cgen, src: *node, dst: str) bool = {
if (base == nil) { return false; };
if (base.kind != nkind.N_IDENT) { return false; };
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
if (bu.kind != tykind.TY_ARRAY) { return false; };
let esz: i32 = 1;
@@ -22581,13 +22577,13 @@ fn cgplaceaddr(c: *cgen, n: *node, dstreg: str) bool = {
// enumerated arms never reach the resolver (those arms
// dispatch first), so their asm is untouched.
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
if (bu.kind != tykind.TY_SLICE && bu.kind != tykind.TY_ARRAY) {
return false;
};
let et: *tinfo = n.type_: *tinfo;
for (et != nil && et.kind == tykind.TY_NAMED) { et = et.under; };
et = tichase(et);
if (et == nil) { return false; };
let esz: i32 = et.size: i32;
cgexpr(c, idx);
@@ -22619,13 +22615,13 @@ fn cgplaceaddr(c: *cgen, n: *node, dstreg: str) bool = {
let base: *node = n.lhs;
if (base == nil) { return false; };
let bu: *tinfo = base.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
if (bu == nil) { return false; };
let viaptr: bool = false;
let st: *tinfo = nil;
if (bu.kind == tykind.TY_PTR) {
let p: *tinfo = bu.sub;
for (p != nil && p.kind == tykind.TY_NAMED) { p = p.under; };
p = tichase(p);
if (p != nil) { if (p.kind == tykind.TY_STRUCT) {
st = p;
viaptr = true;
@@ -23259,9 +23255,7 @@ fn cgslice(c: *cgen, n: *node) void = {
let dotbu: *tinfo = nil;
if (base != nil) { if (base.kind == nkind.N_DOT) {
dotbu = base.type_: *tinfo;
for (dotbu != nil && dotbu.kind == tykind.TY_NAMED) {
dotbu = dotbu.under;
};
dotbu = tichase(dotbu);
};};
// #31: an N_ARRLIT base (the desugared one-step `let xs:[]T=[..]`
// borrow — the ONLY context that reaches here; call-arg/return/assign
@@ -23590,9 +23584,7 @@ fn cgmatch(c: *cgen, n: *node) void = {
// to match. Surfaced by reviewer-37's `match (*p)`
// probe on a 56B box.
let ms37: *tinfo = scrut.type_: *tinfo;
for (ms37 != nil && ms37.kind == tykind.TY_NAMED) {
ms37 = ms37.under;
};
ms37 = tichase(ms37);
if (ms37 != nil && ms37.kind == tykind.TY_TAGGED
&& ms37.size: i32 > TUPLE_GPCAP * 8) {
let m37n: str = "#37: >32B tagged match scrutinee from a non-mem-based source unwired (rule 7)\n";
@@ -24464,13 +24456,13 @@ fn cgdot(c: *cgen, n: *node) void = {
if (idxbase != nil) { if (idxbase.kind == nkind.N_IDENT) {
let elemt: *tinfo = lhs.type_: *tinfo;
let elemu: *tinfo = elemt;
for (elemu != nil && elemu.kind == tykind.TY_NAMED) { elemu = elemu.under; };
elemu = tichase(elemu);
let st: *tinfo = nil;
let viaptr: bool = false;
if (elemu != nil) {
if (elemu.kind == tykind.TY_PTR) {
let pin: *tinfo = elemu.sub;
for (pin != nil && pin.kind == tykind.TY_NAMED) { pin = pin.under; };
pin = tichase(pin);
if (pin != nil) { if (pin.kind == tykind.TY_STRUCT) {
st = pin;
viaptr = true;
@@ -24487,7 +24479,7 @@ fn cgdot(c: *cgen, n: *node) void = {
fwalk = fwalk.tnext;
};
let bu: *tinfo = idxbase.type_: *tinfo;
for (bu != nil && bu.kind == tykind.TY_NAMED) { bu = bu.under; };
bu = tichase(bu);
let baseisarray: bool = false;
let baseok: bool = false;
if (bu != nil) {
@@ -24556,7 +24548,7 @@ fn cgdot(c: *cgen, n: *node) void = {
let foff: i64 = fnd.offset: i64;
let ft: *tinfo = fnd.type_;
let fu: *tinfo = ft;
for (fu != nil && fu.kind == tykind.TY_NAMED) { fu = fu.under; };
fu = tichase(fu);
// #270-1a: an `[N]T`-typed field of an
// array element (`a[i].m[j]`) — leave the
// field's ADDRESS, a base for the outer
@@ -24743,9 +24735,7 @@ fn cgdot(c: *cgen, n: *node) void = {
// registers (ken x5c: o.r.min as size added DX).
if (typeistagged(leaftype)) {
let tlu: *tinfo = leaftype;
for (tlu != nil && tlu.kind == tykind.TY_NAMED) {
tlu = tlu.under;
};
tlu = tichase(tlu);
let ttsz: i32 = tlu.size: i32;
if (viacx) {
if (ptrroot) {
@@ -24899,7 +24889,7 @@ fn cgdot(c: *cgen, n: *node) void = {
{
let pbu: *tinfo = nil;
if (lhs != nil) { pbu = lhs.type_: *tinfo; };
for (pbu != nil && pbu.kind == tykind.TY_NAMED) { pbu = pbu.under; };
pbu = tichase(pbu);
let pbok: bool = false;
if (pbu != nil) {
if (pbu.kind == tykind.TY_SLICE
@@ -24968,11 +24958,11 @@ fn cgdot(c: *cgen, n: *node) void = {
let allptr: bool = true;
for (croot != nil && croot.kind == nkind.N_DOT) {
let ct: *tinfo = croot.type_: *tinfo;
for (ct != nil && ct.kind == tykind.TY_NAMED) { ct = ct.under; };
ct = tichase(ct);
let okp: bool = false;
if (ct != nil) { if (ct.kind == tykind.TY_PTR) {
let cs: *tinfo = ct.sub;
for (cs != nil && cs.kind == tykind.TY_NAMED) { cs = cs.under; };
cs = tichase(cs);
if (cs != nil) { if (cs.kind == tykind.TY_STRUCT) { okp = true; }; };
}; };
if (!okp) { allptr = false; };
@@ -24983,10 +24973,10 @@ fn cgdot(c: *cgen, n: *node) void = {
localfindnode(c, croot.str) != nil) {
it = lhs.type_: *tinfo;
};
for (it != nil && it.kind == tykind.TY_NAMED) { it = it.under; };
it = tichase(it);
if (it != nil) { if (it.kind == tykind.TY_PTR) {
let st: *tinfo = it.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
let tf: *tfield = st.fields;
for (tf != nil) {
@@ -25001,9 +24991,7 @@ fn cgdot(c: *cgen, n: *node) void = {
// scalar tail read stale DX as payload).
if (typeistagged(ft)) {
let plu: *tinfo = ft;
for (plu != nil && plu.kind == tykind.TY_NAMED) {
plu = plu.under;
};
plu = tichase(plu);
emitline("\tMOVQ\tAX, BX\n");
cgloadtaggedfield(c, "BX",
tf.offset: i32,
@@ -25200,7 +25188,7 @@ fn cgdot(c: *cgen, n: *node) void = {
if (lhs != nil) {
if (lhs.kind == nkind.N_DOT) {
let pgu: *tinfo = lhs.type_: *tinfo;
for (pgu != nil && pgu.kind == tykind.TY_NAMED) { pgu = pgu.under; };
pgu = tichase(pgu);
if (pgu != nil) {
if (pgu.kind == tykind.TY_PTR) {
let mp: str = "cgdot: ptr-chained field read unwired in wwstage (task #37)\n";
@@ -25221,7 +25209,7 @@ fn cgdot(c: *cgen, n: *node) void = {
{
let rdt: *tinfo = n.type_: *tinfo;
let rdu: *tinfo = rdt;
for (rdu != nil && rdu.kind == tykind.TY_NAMED) { rdu = rdu.under; };
rdu = tichase(rdu);
if (rdu != nil) {
if (rdu.kind == tykind.TY_TAGGED) {
let mt: str = "read-resolver: tagged field read not wired (rule-7)\n";
@@ -25751,7 +25739,7 @@ fn cgun(c: *cgen, n: *node) void = {
// pulled a[0]'s VALUE and `(*p)[i]` then dereferenced it as
// the index base — a wild pointer, SIGSEGV on both stages.
let rti: *tinfo = n.type_: *tinfo;
for (rti != nil && rti.kind == tykind.TY_NAMED) { rti = rti.under; };
rti = tichase(rti);
if (rti != nil && rti.kind == tykind.TY_FN) { return; };
if (rti != nil && rti.kind == tykind.TY_ARRAY) { return; };
// Family C (#35/#46): a tagged box behind *p joins the
@@ -26280,7 +26268,7 @@ fn cgappend(c: *cgen, n: *node) void = {
// same source cstage reads (sn->type → su->sub->size).
sti = sn.type_: *tinfo;
let fsti: *tinfo = sti;
for (fsti != nil && fsti.kind == tykind.TY_NAMED) { fsti = fsti.under; };
fsti = tichase(fsti);
if (fsti != nil && fsti.sub != nil) { esz = fsti.sub.size: i32; };
if (esz <= 0) {
let m15z: str = "#15: append() target element size unresolved (rule-7)\n";
@@ -26295,16 +26283,14 @@ fn cgappend(c: *cgen, n: *node) void = {
// the value node's literal tinfo is the #25/#31 esz=0 trap.
// Mirrors cstage cgen.c's append arm + the #270/#12/#20
// array-literal element dispatch (cgarrlitfillbp).
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esubti: *tinfo = nil;
if (sti != nil) { esubti = sti.sub; };
// FA1: pre-peel handle — the indirect struct-lit fill keys its
// structinfo off the NAMED element tinfo's name (the same leaf
// structlookupchain resolves from the declared tnode).
let esubnamed: *tinfo = esubti;
for (esubti != nil && esubti.kind == tykind.TY_NAMED) {
esubti = esubti.under;
};
esubti = tichase(esubti);
let elstr: bool = esubti != nil && esubti.kind == tykind.TY_STR;
let elslice: bool = esubti != nil && esubti.kind == tykind.TY_SLICE;
let eltagged: bool = esubti != nil && esubti.kind == tykind.TY_TAGGED;
@@ -26351,7 +26337,7 @@ fn cgappend(c: *cgen, n: *node) void = {
// shares the slice header layout.
let itu: *tinfo = nil;
if (it != nil) { itu = it.type_: *tinfo; };
for (itu != nil && itu.kind == tykind.TY_NAMED) { itu = itu.under; };
itu = tichase(itu);
if (itu == nil || (itu.kind != tykind.TY_SLICE
&& itu.kind != tykind.TY_STR)) {
let m35p: str = "#35: append() spread source shape unsupported (rule-7)\n";
@@ -26586,7 +26572,7 @@ fn cgappend(c: *cgen, n: *node) void = {
let af: *tfield = nil;
if (ab != nil) {
let abu: *tinfo = ab.type_: *tinfo;
for (abu != nil && abu.kind == tykind.TY_NAMED) { abu = abu.under; };
abu = tichase(abu);
if (abu != nil && abu.kind == tykind.TY_STRUCT) {
let fl: *tfield = abu.fields;
for (fl != nil) {
@@ -26602,11 +26588,11 @@ fn cgappend(c: *cgen, n: *node) void = {
if (aok && ch.kind == nkind.N_INDEX) {
let ab: *node = ch.lhs;
let aet: *tinfo = ch.type_: *tinfo;
for (aet != nil && aet.kind == tykind.TY_NAMED) { aet = aet.under; };
aet = tichase(aet);
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 || abu == nil || aet == nil
|| (abu.kind != tykind.TY_SLICE && abu.kind != tykind.TY_ARRAY)) {
@@ -26889,10 +26875,10 @@ fn cgdelete(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -27021,10 +27007,10 @@ fn cgdeleterange(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -27220,10 +27206,10 @@ fn cginsert(c: *cgen, n: *node) void = {
// value node). Peel TY_NAMED on indexable AND element, mirroring
// cstage's type_chase_named on both (#8 family).
let sti: *tinfo = base.type_: *tinfo;
for (sti != nil && sti.kind == tykind.TY_NAMED) { sti = sti.under; };
sti = tichase(sti);
let esub: *tinfo = nil;
if (sti != nil) { esub = sti.sub; };
for (esub != nil && esub.kind == tykind.TY_NAMED) { esub = esub.under; };
esub = tichase(esub);
let esz: i32 = 0;
if (esub != nil) { esz = esub.size: i32; };
if (esz <= 0) {
@@ -27537,9 +27523,7 @@ fn cgcall(c: *cgen, n: *node) void = {
let a: *node = n.list;
let at: *tinfo = a.type_: *tinfo;
let u: *tinfo = at;
for (u != nil && u.kind == tykind.TY_NAMED) {
u = u.under;
};
u = tichase(u);
let hdrish: bool = false;
if (u != nil) {
if (u.kind == tykind.TY_SLICE
@@ -28412,9 +28396,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& n.op == tkind.TK_ASSIGN && n.rhs != nil) {
if (n.rhs.kind == nkind.N_STRUCTLIT) {
let iet: *tinfo = lhs.type_: *tinfo;
for (iet != nil && iet.kind == tykind.TY_NAMED) {
iet = iet.under;
};
iet = tichase(iet);
if (iet != nil) {
if (iet.kind == tykind.TY_STRUCT) {
placeslit = true;
@@ -28434,9 +28416,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (lhs.kind == nkind.N_UN && lhs.op == tkind.TK_STAR
&& n.op == tkind.TK_ASSIGN) {
let du: *tinfo = lhs.type_: *tinfo;
for (du != nil && du.kind == tykind.TY_NAMED) {
du = du.under;
};
du = tichase(du);
if (du != nil) {
if (du.kind == tykind.TY_STRUCT
|| du.kind == tykind.TY_ARRAY
@@ -28467,9 +28447,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (n.op == tkind.TK_ASSIGN && lhs != nil && n.rhs != nil) {
if (n.rhs.kind == nkind.N_ARRLIT) {
let alt: *tinfo = lhs.type_: *tinfo;
for (alt != nil && alt.kind == tykind.TY_NAMED) {
alt = alt.under;
};
alt = tichase(alt);
if (alt != nil) {
if (alt.kind == tykind.TY_ARRAY) {
let mal: str = "array-literal store at assignment unwired (task #32)\n";
@@ -28504,13 +28482,9 @@ fn cgassign(c: *cgen, n: *node) void = {
};
if (asret > 0) {
let aru: *tinfo = n.rhs.type_: *tinfo;
for (aru != nil && aru.kind == tykind.TY_NAMED) {
aru = aru.under;
};
aru = tichase(aru);
let alu: *tinfo = lc.tnode.type_: *tinfo;
for (alu != nil && alu.kind == tykind.TY_NAMED) {
alu = alu.under;
};
alu = tichase(alu);
let aexact: bool = false;
if (aru != nil && aru == alu) { aexact = true; }
else {
@@ -28540,9 +28514,7 @@ fn cgassign(c: *cgen, n: *node) void = {
if (lc == nil && n.rhs != nil) {
if (n.rhs.kind == nkind.N_CALL) {
let gru: *tinfo = lhs.type_: *tinfo;
for (gru != nil && gru.kind == tykind.TY_NAMED) {
gru = gru.under;
};
gru = tichase(gru);
if (gru != nil && gru.kind == tykind.TY_TAGGED
&& callsretsize(c, n.rhs) > 0) {
let m38g: str = "#38b: sret receive into a tagged GLOBAL lvalue unwired\n";
@@ -30539,11 +30511,11 @@ fn cgassign(c: *cgen, n: *node) void = {
let allptr: bool = true;
for (croot != nil && croot.kind == nkind.N_DOT) {
let ct: *tinfo = croot.type_: *tinfo;
for (ct != nil && ct.kind == tykind.TY_NAMED) { ct = ct.under; };
ct = tichase(ct);
let okp: bool = false;
if (ct != nil) { if (ct.kind == tykind.TY_PTR) {
let cs: *tinfo = ct.sub;
for (cs != nil && cs.kind == tykind.TY_NAMED) { cs = cs.under; };
cs = tichase(cs);
if (cs != nil) { if (cs.kind == tykind.TY_STRUCT) { okp = true; }; };
}; };
if (!okp) { allptr = false; };
@@ -30554,10 +30526,10 @@ fn cgassign(c: *cgen, n: *node) void = {
localfindnode(c, croot.str) != nil) {
it = base.type_: *tinfo;
};
for (it != nil && it.kind == tykind.TY_NAMED) { it = it.under; };
it = tichase(it);
if (it != nil) { if (it.kind == tykind.TY_PTR) {
let st: *tinfo = it.sub;
for (st != nil && st.kind == tykind.TY_NAMED) { st = st.under; };
st = tichase(st);
if (st != nil) { if (st.kind == tykind.TY_STRUCT) {
let tf: *tfield = st.fields;
for (tf != nil) {
@@ -30574,9 +30546,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// landed in the TAG slot (ken b8).
if (typeistagged(ft)) {
let flu: *tinfo = ft;
for (flu != nil && flu.kind == tykind.TY_NAMED) {
flu = flu.under;
};
flu = tichase(flu);
cgexpr(c, base);
emitline("\tMOVQ\tAX, BX\n");
cgwidentaggedstore(c, flu, n.rhs,
@@ -30801,9 +30771,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// (TK_ASSIGN gate above).
if (typeistagged(leaftype)) {
let wlu: *tinfo = leaftype;
for (wlu != nil && wlu.kind == tykind.TY_NAMED) {
wlu = wlu.under;
};
wlu = tichase(wlu);
let wtsz: i32 = wlu.size: i32;
if (viacx) {
if (ptrroot) {
@@ -30889,9 +30857,7 @@ fn cgassign(c: *cgen, n: *node) void = {
let leafname: str = "";
if (leaftype != nil) {
let lp: *tinfo = leaftype;
for (lp != nil && lp.kind == tykind.TY_NAMED) {
lp = lp.under;
};
lp = tichase(lp);
if (lp != nil) {
if (lp.kind == tykind.TY_STRUCT) { leafstruct = true; };
};
@@ -31366,7 +31332,7 @@ fn cgassign(c: *cgen, n: *node) void = {
};
if (lvftn.kind == nkind.N_TARRAY) {
let gat: *tinfo = lvftn.type_: *tinfo;
for (gat != nil && gat.kind == tykind.TY_NAMED) { gat = gat.under; };
gat = tichase(gat);
if (gat != nil) { gsz = gat.size: i32; };
};
if (gsz > 24) {
@@ -31395,7 +31361,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& lvftn.kind == nkind.N_TARRAY) {
let aggsz: i32 = 0;
let aat: *tinfo = lvftn.type_: *tinfo;
for (aat != nil && aat.kind == tykind.TY_NAMED) { aat = aat.under; };
aat = tichase(aat);
if (aat != nil) { aggsz = aat.size: i32; };
if (aggsz > 0 && aggsz <= 24) {
cgexpr(c, n.rhs);
@@ -31438,9 +31404,7 @@ fn cgassign(c: *cgen, n: *node) void = {
// tail below: one MOVQ AX, g(SB).
if (n.op == tkind.TK_ASSIGN && lvftn != nil) {
let gau: *tinfo = lvftn.type_: *tinfo;
for (gau != nil && gau.kind == tykind.TY_NAMED) {
gau = gau.under;
};
gau = tichase(gau);
if (gau != nil) {
if (gau.kind == tykind.TY_STRUCT
|| gau.kind == tykind.TY_ARRAY
@@ -31749,9 +31713,7 @@ fn cgassign(c: *cgen, n: *node) void = {
&& n.rhs != nil && n.rhs.kind == nkind.N_CALL) {
let acati: *tinfo = nil;
if (lcn.tnode != nil) { acati = lcn.tnode.type_: *tinfo; };
for (acati != nil && acati.kind == tykind.TY_NAMED) {
acati = acati.under;
};
acati = tichase(acati);
if (acati != nil && acati.kind == tykind.TY_ARRAY) {
let lcsz: i32 = acati.size: i32;
if (lcsz > 24) {
@@ -31872,9 +31834,7 @@ fn cgassign(c: *cgen, n: *node) void = {
agu = lcn.tnode.type_: *tinfo;
};
};
for (agu != nil && agu.kind == tykind.TY_NAMED) {
agu = agu.under;
};
agu = tichase(agu);
if (agu != nil) {
if (agu.kind == tykind.TY_STRUCT
|| agu.kind == tykind.TY_ARRAY
@@ -32036,9 +31996,7 @@ fn cgassign(c: *cgen, n: *node) void = {
|| (lhs.kind == nkind.N_UN && lhs.op == tkind.TK_STAR)) {
let ft: *tinfo = lhs.type_: *tinfo;
let fu: *tinfo = ft;
for (fu != nil && fu.kind == tykind.TY_NAMED) {
fu = fu.under;
};
fu = tichase(fu);
let fsz: i32 = 8;
if (ft != nil) { fsz = ft.size: i32; };
if (typeisfloat(ft)) {