// Cross-type rules for the numeric-limit accessors. `.min` / `.max` are valid on // BOTH integer and float types, but `.epsilon` / `.min_positive` / `.true_min` / // `.inf` / `.nan` are FLOAT-ONLY. Applying a float-only accessor to an INTEGER // type, or ANY accessor to a non-numeric type, is a clean compile error — never // a silent value, never the `.unresolved` sentinel reaching codegen. // // - float-only accessor on an integer (`s32.epsilon`, `u8.inf`, // `s64.true_min`) → a dedicated "applies only to float types" diagnostic // from the accessor intercept, located at the access; // - any accessor on a non-numeric builtin (`bool.nan`, `string.max`) → the // "numeric limits apply only to integer and float types" diagnostic; // - a user struct (`MyStruct.epsilon`) → the type name is not a builtin, so the // intercept stays out and the existing field-not-found path reports it. // Each case is accurate and located at the access; the program exits non-zero. #import "modules/std.sx"; MyStruct :: struct { a: s64; } main :: () -> s32 { a := s32.epsilon; b := u8.inf; c := s64.true_min; d := bool.nan; e := string.max; f := MyStruct.epsilon; return 0; }