checkIntLiteralFits range-checks a literal against its integer target (builtins + custom widths via intLiteralRange; width-64 types skip — every representable literal is a legal bit pattern there) and diagnoses with the type's range and an xx/cast hint. Wired into the .int_literal arm (covers decls, assignments, call args, struct-literal fields), lowerStructConstant, and globalInitValue. A negated literal now folds to a single constant so -128 range-checks as -128 rather than as an out-of-range +128 intermediate. An explicit xx operand skips the check — truncation stays available on request (cast(T) was already exempt: its value arg lowers without the target). examples/0300-closures-lambda.sx pinned 133 wrapping to -3 through an s3 param — the exact class this outlaws; updated to a fitting value. Found during the fix and filed separately: issue 0113 (negated-literal global initializers rejected as non-constant; pre-existing). Regressions: examples/1156-diagnostics-int-literal-out-of-range.sx, examples/0174-types-int-literal-boundaries.sx.
13 lines
343 B
Plaintext
13 lines
343 B
Plaintext
// An integer literal that does not fit its integer target type is a
|
|
// compile error (no silent wrap): both faces diagnosed in one run.
|
|
// Regression (issue 0112): `x : s8 = 300` bound 44, `y : u8 = 256` bound 0.
|
|
|
|
#import "modules/std.sx";
|
|
|
|
main :: () {
|
|
x : s8 = 300;
|
|
print("x: {}\n", x);
|
|
y : u8 = 256;
|
|
print("y: {}\n", y);
|
|
}
|