// Unified float→int narrowing rule (F0.11), NEGATIVE side: a NON-INTEGRAL float // implicitly narrowing to an integer-typed binding is a COMPILE ERROR — not a // silent truncation. The rule fires at a typed LOCAL initializer, a function // PARAM default, and a struct FIELD default; each emits a narrowing diagnostic // at the offending float and aborts (exit 1). The fix is the integral-fold / // non-integral-error rule shared with the array-dimension path. // // The escape hatch stays open: `y : s64 = xx 1.5` (or `cast(s64) 1.5`) // truncates with no error — exercised on the POSITIVE side (example 0168). // // Regression (issue 0095): `y : s64 = 1.5` silently truncated to 1. #import "modules/std.sx"; Bad :: struct { f : s64 = 3.5; // non-integral field default → error } badDefault :: (x : s64 = 2.5) -> s64 { return x; } // non-integral param default → error main :: () { y : s64 = 1.5; // non-integral local initializer → error b := Bad.{}; print("{}\n", b.f); print("{}\n", badDefault()); print("{}\n", y); }