diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index e9db80b71ea01..50fdeb391056f 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -203,10 +203,12 @@ impl LintPass for TypeLimits { } else { t }; - let (min, max) = int_ty_range(int_type); + let (_, max) = int_ty_range(int_type); let negative = self.negated_expr_id == e.id; - if (negative && min != i64::MIN && v > -min as u64) || + // Detect literal value out of range [min, max] inclusive + // avoiding use of -min to prevent overflow/panic + if (negative && v > max as u64 + 1) || (!negative && v > max as u64) { cx.span_lint(OVERFLOWING_LITERALS, e.span, &*format!("literal out of range for {:?}", t)); diff --git a/src/test/compile-fail/lint-type-overflow.rs b/src/test/compile-fail/lint-type-overflow.rs index ed6a0bd37eb28..eb5b77f7a45a3 100644 --- a/src/test/compile-fail/lint-type-overflow.rs +++ b/src/test/compile-fail/lint-type-overflow.rs @@ -52,6 +52,8 @@ fn main() { let x = 9223372036854775808_i64; //~ error: literal out of range for i64 let x = -9223372036854775808_i64; // should be OK let x = 18446744073709551615_i64; //~ error: literal out of range for i64 + let x: i64 = -9223372036854775809; //~ error: literal out of range for i64 + let x = -9223372036854775809_i64; //~ error: literal out of range for i64 let x = -3.40282348e+38_f32; //~ error: literal out of range for f32 let x = 3.40282348e+38_f32; //~ error: literal out of range for f32