// 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);
}
