Four seams from one review cluster, all landing on the same checker files; gates ran on the union (rule 11 body). ?-subset: the wwstage walk compared `...spread` ALIAS nodes on both sides of the error-subset check, falsely rejecting a spread-carried error return (`(i64 | ...errs)`, cs-accept/ww-reject) — both sides now flatten like trycountvariants (cstage Tparams are pre-flattened at type level). Multi-let/multi-assign: the tuple gates keyed on the RAW rhs kind, rejecting a NAMED tuple alias (`type pair = (i64,i64)`; cs clean- reject, ww asserttyped stop) — both stages chase per #99 alias transparency, wwstage rettupleof peels the alias so cgmassign keeps the str element's len/cap stores, and the catA massign-alias error pin re-rules to a run fixture. The N_MLET diagnostic also printed its operands swapped (elem/declared reversed vs its wording). Yield: match_yield_type didn't descend into N_SWITCH, so a yield inside a switch arm typed the match void and dropped the value (both stages); and a stray yield outside any match arm reached cgen unchecked — both stages now gate on a match-arm counter (the c->loops discipline).
17 lines
485 B
Plaintext
17 lines
485 B
Plaintext
//ww:run-exit 0
|
|
// #99 alias transparency at multi-assign (re-ruled from the catA
|
|
// error pin): a NAMED tuple alias return destructures like its base;
|
|
// rettupleof peels the alias so the str element keeps len/cap.
|
|
package main;
|
|
type pair = (i64, str);
|
|
fn f() pair = { return (7i64, "hey"); };
|
|
export fn main() i32 = {
|
|
let a: i64 = 0i64;
|
|
let s: str = "";
|
|
a, s = f();
|
|
if (a != 7i64) { return 1; };
|
|
if (s.len != 3) { return 2; };
|
|
if (s[0] != 'h': u8) { return 3; };
|
|
return 0;
|
|
};
|