Files
ww/test/lang/alias_def_addr_test.ww
Hojun-Cho 83f5956df2 test: banner purge + WHY-only comment sweep (rule 8)
Every section banner dies (103 -> 0) across test/lang, the observer
suites, the C carriers, and the five comment-heavy corpus fixtures;
banner provenance (#N cites, carrier numbers, repair-cluster labels)
folded into headers or adjacent WHY comments. Narration deleted; row
provenance, ref cites, divergence pins, and layout contracts kept
(fwd-ref decl-order guards and bootstrap-gate corpus rationale
restored where the sweep over-cut). Comment-only proven: all 3742
wwbuild workdir .s byte-identical before/after; test-commit and
test-byteid (161 lang + 1399 data, 0 pinned-divergent) green.
2026-08-08 21:40:23 +09:00

70 lines
2.6 KiB
Plaintext

// Address-of a def whose declared type is an ALIAS of
// an array/struct (#5 alias arc F2a, task #88), migrated from
// test/wcc/944_alias_def_addr_run.c. defisaddressable (cgen.ww) keyed the
// array leg on the UNCHASED syntactic dtnode (N_TARRAY), so `&D` where D is a
// def typed as an ALIAS of an array missed the gate and fell to the rule-7
// loud "non-addressable def" tail — even though the def-array DATA emitter
// already peels TY_NAMED transitively, so the alias def HAS a DATA symbol.
// The gate-only fix (tichase(dtn.type_) == TY_ARRAY) restores gate ==
// emission set; cstage (def_isarraydef over the chased let_isarray) is the
// runtime-correct reference. Pre-fix: def_l1/def_l2/def_order ww LOUD, cs 0.
// These rows are the #88 ASM-FRAGILE surface (&def / alias-of-addr is exactly
// where cs!=ww surfaces) — T2 keeps cs==ww. The non-addressable str def
// (`&S`, no DATA symbol) STAYS a loud rule-7 reject and is the runww carrier
// (test/wcc/data/alias_def_addr_nonaddr). PRIMITIVE-only asserts (readback
// through the &-derived pointer is the pin — a wrong address or wrong DATA
// emission yields a wrong readback; no fmt/strconv in any assert path).
// def_l2's readback casts to the BASE array ptr before the deref-index: the
// natural `(*p)[2]` over a 2-LEVEL-alias pointee trips a SEPARATE pre-existing
// cstage double-deref (task #93), deliberately not exercised here.
package alias_def_addr_test;
def Dctrl: [3]int = [1000: int, 2000: int, 3000: int];
@test fn alias_def_addr_ctrl() void = {
let p: *[3]int = &Dctrl;
assert((*p)[2] == 3000);
};
// def_l1 — 1-level alias def array; &D missed the unchased gate pre-fix.
type arr1 = [3]int;
def Dl1: arr1 = [1000: int, 2000: int, 3000: int];
@test fn alias_def_addr_l1() void = {
let p: *arr1 = &Dl1;
assert((*p)[2] == 3000);
};
// def_l2 — 2-level alias; readback casts to the BASE array ptr (task #93).
type arr2a = [3]int;
type arr2b = arr2a;
def Dl2: arr2b = [1000: int, 2000: int, 3000: int];
@test fn alias_def_addr_l2() void = {
let p: *arr2b = &Dl2;
let q: *[3]int = p: *[3]int;
assert((*q)[2] == 3000);
};
// def_order — the alias type is declared AFTER the def that uses it.
def Dord: arrord = [1000: int, 2000: int, 3000: int];
@test fn alias_def_addr_order() void = {
let p: *arrord = &Dord;
assert((*p)[2] == 3000);
};
type arrord = [3]int;
// def_struct — alias-typed STRUCT def; defvarstructinfo already chased
// aliaslookup transitively, so this leg held before and after (PREMISE-5).
type pt = struct { x: int, y: int };
type pt2 = pt;
def Dstruct: pt2 = pt2{x = 1000, y = 2000};
@test fn alias_def_addr_struct() void = {
let p: *pt2 = &Dstruct;
assert(p.y == 2000);
};