wcc+w6c_ww: typed dot-read resolver — kill both silent N_DOT fallbacks (F4)
A typed depth-2+ field chain behind an index/deref spine (threads[0].cap.end, (*p)[i].f.g) aborted the cgdot chain walker (N_IDENT roots only) and fell into the module-qualified-leaf fallback — a silent `MOVQ <leaf>(SB)` global read of a colliding symbol (p6min10 exit 66) or a link error. Single-dot reads behind a deref- index ((*ts)[i].pc, (*p)[i].slicefield) fell into the bottom catch-all instead, which is offset- and header-blind: offset-0 scalars read correctly by COINCIDENCE, nonzero offsets and slice headers were silently wrong in BOTH stages (FA3, pA5). `&threads[0].cap` dropped the address-of silently and SEGFAULTed at the deref (task #6, reviewer-A route). cgplaceaddr (C1) grows an N_IDENT root (local / let / DATA-backed def) and the N_INDEX base gate relaxes to recursion, so indexed-ident and deref-rooted spines resolve; enumerated arms still dispatch first, keeping every pre-C1 shape's asm. case N_DOT routes any TYPED read no arm matched through the resolver (scalar fldloadop, float X0, str/ slice 3-word header, [N]T address); the module-leaf fallback is gated to UNTYPED chains, the catch-all to untyped-str pseudo-fields, and the TK_AMP tail is resolver-or-loud. Leaf kinds without a register convention (tagged, aggregate) and unaddressable shapes die LOUD (rule 7). wwstage mirrors symmetrically; two of its arm gaps must not take the resolver (its sequence differs from cstage's arms — cs!=ww): ident-indexed alias reads loud-cite C3 (task #8) and non-local-rooted ptr-chains loud-cite task #37. A third verdict divergence is comment- documented at the wwstage aggregate gate: cstage's let-init consumes `let c = (*ts)[i].cap` BEFORE its N_DOT tail (emitting NO copy — the F5 bug), so that shape cs-builds/ww-louds until the F5 let-copy lands (task #7); absent from the gate corpus. 806 identroot_dot graduates from BUILD_FAIL: the C2 ident root makes append(h.xs, v) through *holder resolve via C1.5's place consumer (run-verified, byte-id). p6min9/p6min10 read-halves are fixed but the probes stay blocked on the #36 literal under-copy this commit unmasked (struct-ident field rhs copies 8B; repro filed with the task). test/805: +7 rows (typed depth-2 behind ident-index incl the 777 global-collision pin, deref-index, width/float/[N]u8 matrix, FA3 slice-field + .cap-behind-spine, &-route with compound-through- pointer, C1's reject_tail graduated to stores, neutrality pins) and +4 reject rows pinning the new loud texts; the C1.25 raw-byte readbacks graduate to typed depth-2 reads.
This commit is contained in:
@@ -42,8 +42,8 @@
|
||||
* | — nested indirect append inside the |
|
||||
* | outer's value expr; pins the per-SITE |
|
||||
* | @apphdrscr slot (a shared slot clobbers)|
|
||||
* reject_identroot_dot | h.xs via *holder param (resolver ident | BUILD_FAIL
|
||||
* | root unwired — was silent corruption) |
|
||||
* identroot_dot | h.xs via *holder param — C1.5's reject, | 73
|
||||
* | graduated by C2's resolver ident root |
|
||||
* reject_spread_src | non-ident spread SOURCE through a deref | BUILD_FAIL
|
||||
* | target (the #35 designed boundary) |
|
||||
*
|
||||
@@ -372,20 +372,28 @@ static const struct row rows[] = {
|
||||
"};\n",
|
||||
33, NULL },
|
||||
|
||||
/* Ident-rooted dot target (h.xs through *holder): the resolver
|
||||
* does not wire ident roots (they belong to the enumerated arms;
|
||||
* none exists for append yet) — pre-fix this shape silently
|
||||
* corrupted the frame in cstage; now it must die LOUD. */
|
||||
{ "reject_identroot_dot",
|
||||
/* Ident-rooted dot target (h.xs through *holder): C1.5's loud
|
||||
* boundary (the resolver had no ident root then; pre-FA1 this
|
||||
* shape silently corrupted the frame in cstage), graduated by
|
||||
* C2's cgplaceaddr N_IDENT root — the *holder base derefs once
|
||||
* inside the N_DOT hop and the header place lands on &h.xs.
|
||||
* Readbacks use the .len pseudo, not len(): len() of a non-tuple
|
||||
* N_DOT is the pre-existing F2 enumeration gap (task #10). */
|
||||
{ "identroot_dot",
|
||||
"package main;\n"
|
||||
"type holder = struct { tag: i64, xs: []i64 };\n"
|
||||
"fn addfield(h: *holder, v: i64) void = { append(h.xs, v); };\n"
|
||||
"export fn main() i32 = {\n"
|
||||
"\tlet hl: holder = holder { tag = 2, xs = [] };\n"
|
||||
"\taddfield(&hl, 9);\n"
|
||||
"\treturn 0;\n"
|
||||
"\taddfield(&hl, 11);\n"
|
||||
"\tif (hl.xs[0] != 9) { return 1; };\n"
|
||||
"\tif (hl.xs[1] != 11) { return 2; };\n"
|
||||
"\tif (hl.xs.len != 2) { return 3; };\n"
|
||||
"\tif (hl.tag != 2) { return 4; };\n"
|
||||
"\treturn 73;\n"
|
||||
"};\n",
|
||||
BUILD_FAIL, "#15: append() target place unsupported (rule-7)" },
|
||||
73, NULL },
|
||||
|
||||
/* The FA4 designed boundary (task #35, old #37): a spread SOURCE that is
|
||||
* not an ident local must stay loud even now that the deref
|
||||
|
||||
Reference in New Issue
Block a user