// A generic value-param arg that does not fit the param's declared integer type // is a hard error even when that type is reached through a type ALIAS // (`$K: Count` where `Count :: u32`, `$K: Small` where `Small :: i8`) — a clean // diagnostic + non-zero exit, NOT a silent truncating bind. // // Regression (issue 0083): the value-param range gate matched only BUILTIN // constraint names, so an aliased constraint slipped past `intTypeRange` and // `Box(5_000_000_000)` with `$K: Count` compiled and bound a truncated value. // The constraint now resolves to its underlying builtin (`Count` → u32, // `Small` → i8) before range-checking, so an aliased integer constraint behaves // exactly like the builtin it names — at both the struct and type-fn binders. #import "modules/std.sx"; Count :: u32; Small :: i8; Box :: struct ($K: Count) { value: i64; } Tiny :: struct ($K: Small) { value: i64; } main :: () { b : Box(5000000000) = ---; t : Tiny(300) = ---; print("unreachable {} {}\n", b.value, t.value); }