test/949: pin nullable (*T|void) tagged-element read byte-id (#261 deviation)
This commit is contained in:
@@ -657,6 +657,41 @@ static const struct row rows[] = {
|
|||||||
" case void => yield 1: i32;\n"
|
" case void => yield 1: i32;\n"
|
||||||
" };\n"
|
" };\n"
|
||||||
"};\n", 33, 1 },
|
"};\n", 33, 1 },
|
||||||
|
/* #261 NULLABLE-fold deviation: a (*T | void) element is the 8B
|
||||||
|
* one-word fold, NOT the 16B tag+payload slot. The fix mirrors
|
||||||
|
* cstage exactly — classify TY_TAGGED for ANY base WITHOUT excluding
|
||||||
|
* the nullable fold (slot_sz=8 degrades the copy arm to a single
|
||||||
|
* MOVQ). These rows pin that the no-exclusion path is byte-id for the
|
||||||
|
* fold too. The pointer-present / void cases prove the discriminant
|
||||||
|
* (the pointer value itself) survives materialization. The variant
|
||||||
|
* payload is read by constant (no `*p` deref) only to dodge an
|
||||||
|
* ORTHOGONAL pre-existing wwstage checker bug (asserttyped: un on a
|
||||||
|
* deref of a match-bound pointer) — distinct from #261's cgen axis. */
|
||||||
|
{ "tagged_null_ptr_rd",
|
||||||
|
"package main;\n"
|
||||||
|
"type e = struct { o: [4](*i32 | void) };\n"
|
||||||
|
"export fn main() i32 = {\n"
|
||||||
|
" let k: i32 = 7;\n"
|
||||||
|
" let x: e;\n"
|
||||||
|
" x.o[1] = &k;\n"
|
||||||
|
" let v: (*i32 | void) = x.o[1];\n"
|
||||||
|
" return match (v) {\n"
|
||||||
|
" case let p: *i32 => yield 55: i32;\n"
|
||||||
|
" case void => yield 1: i32;\n"
|
||||||
|
" };\n"
|
||||||
|
"};\n", 55, 1 },
|
||||||
|
{ "tagged_null_void_rd",
|
||||||
|
"package main;\n"
|
||||||
|
"type e = struct { o: [4](*i32 | void) };\n"
|
||||||
|
"export fn main() i32 = {\n"
|
||||||
|
" let x: e;\n"
|
||||||
|
" x.o[1] = void;\n"
|
||||||
|
" let v: (*i32 | void) = x.o[1];\n"
|
||||||
|
" return match (v) {\n"
|
||||||
|
" case let p: *i32 => yield 99: i32;\n"
|
||||||
|
" case void => yield 1: i32;\n"
|
||||||
|
" };\n"
|
||||||
|
"};\n", 1, 1 },
|
||||||
{ NULL, NULL, 0, 0 }
|
{ NULL, NULL, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user