The wwstage nodeisstr/nodeisslice recognizers were name-keyed for every non-local shape: an indirect fn-pointer callee ((*f)() — the errnotest #59.5 divergence, streq receiving a shifted register file) and module-global let/const idents (path.sepstr — union-widen pushes zero-filled len/cap) both fell to false while cstage keys off the checker stamp unconditionally. Both recognizers now fall back to the stamped n.type_; push and pop sites share them, so the drain stays balanced by construction. Graduates the #59.5 errnotest pin.
25 lines
542 B
Plaintext
25 lines
542 B
Plaintext
//ww:run
|
|
// A module-global const str widened into a tagged-union call arg.
|
|
// The pre-fix wwstage nodeisstr N_IDENT arm knew only frame slots and
|
|
// defs, so the widen push took the scalar arm and zero-filled len/cap
|
|
// (path.sepstr's strings.hasprefix shape).
|
|
package main;
|
|
|
|
const gs: str = "hello";
|
|
|
|
fn f(x: (str | i32)) i32 = {
|
|
match (x) {
|
|
case let s: str => {
|
|
if (s.len != 5) { return 1; };
|
|
if (s[4] != 111u8) { return 2; };
|
|
return 0;
|
|
};
|
|
case let v: i32 => { return 3; };
|
|
};
|
|
return 4;
|
|
};
|
|
|
|
fn main() i32 = {
|
|
return f(gs);
|
|
};
|