w6c: forrange bind cap loud; drain widen gates keyed on type-eq (#55)
Two silent seams in one sweep. The for-range destructure silently dropped the 9th+ binding in both stages (bind arrays are sized 8); the cap now hard-stops per the DEFER_MAX/LOOP_MAX discipline (the shape is unreachable today -- every wide-tuple construction path already loud-stops). argtaggedwidensz, the drain-side SSoT for widened call args, still keyed "natural push" on slot-size equality while pushargsrev flipped to type equality with #55 -- a same-slot subset was classified widen by push, natural by drain (counts coincide today; a classification reader desyncs, the #48 shape). Both sides now share the wsame key; the widen-branch tag miss for a concrete source joins the task-2 loud-stop family (tagged subset sources keep t=0 -- their widentag is never read, the scratch store remaps). Lead 17 (enum fold-failure prev+1) DISPROVED: enumvalfold gates every member init in the checker and its fold set is op-for-op equal to cgen's enumevalmember, so the fallback only runs inside already-failing compiles.
This commit is contained in:
17
test/wcc/data/subset_arg_widen/case.ww
Normal file
17
test/wcc/data/subset_arg_widen/case.ww
Normal file
@@ -0,0 +1,17 @@
|
||||
//ww:run-exit 0
|
||||
// #55 drain-SSoT leg: a same-slot subset ((bool|void) -> (i64|bool|void),
|
||||
// both 16B) call arg is classified WIDEN by push AND drain — the old
|
||||
// slot-size drain gates called it natural. The 0->1 tag remap through
|
||||
// the widen scratch is what this pins.
|
||||
package main;
|
||||
type narrow = (bool | void);
|
||||
type wide = (i64 | bool | void);
|
||||
fn take(w: wide) i32 = {
|
||||
if (w is bool) { return 7; };
|
||||
return 1;
|
||||
};
|
||||
export fn main() i32 = {
|
||||
let n: narrow = true;
|
||||
if (take(n) != 7) { return 1; };
|
||||
return 0;
|
||||
};
|
||||
Reference in New Issue
Block a user