Enable ConstPropLint
for promoteds
This fixes the issue wherein the lint didn't fire for promoteds in the case of SHL/SHR operators in non-optimized builds and all arithmetic operators in optimized builds
This commit is contained in:
parent
405b22f1a3
commit
5010ca001c
@ -32,11 +32,6 @@ impl<'tcx> MirLint<'tcx> for ConstPropLint {
|
||||
return;
|
||||
}
|
||||
|
||||
// will be evaluated by miri and produce its errors there
|
||||
if body.source.promoted.is_some() {
|
||||
return;
|
||||
}
|
||||
|
||||
let def_id = body.source.def_id().expect_local();
|
||||
let def_kind = tcx.def_kind(def_id);
|
||||
let is_fn_like = def_kind.is_fn_like();
|
||||
|
@ -1,12 +1,17 @@
|
||||
//@compile-flags: -C overflow-checks=off
|
||||
|
||||
// Check that we correctly implement the intended behavior of these operators
|
||||
// when they are not being overflow-checked.
|
||||
// when they are not being overflow-checked at runtime.
|
||||
|
||||
// FIXME: if we call the functions in `std::ops`, we still get the panics.
|
||||
// Miri does not implement the codegen-time hack that backs `#[rustc_inherit_overflow_checks]`.
|
||||
// use std::ops::*;
|
||||
|
||||
|
||||
// Disable _compile-time_ overflow linting
|
||||
// so that we can test runtime overflow checks
|
||||
#![allow(arithmetic_overflow)]
|
||||
|
||||
fn main() {
|
||||
assert_eq!(-{ -0x80i8 }, -0x80);
|
||||
|
||||
|
@ -20,7 +20,7 @@ note: ...which requires const-evaluating + checking `Tr::B`...
|
||||
LL | const B: u8 = Self::A;
|
||||
| ^^^^^^^
|
||||
= note: ...which again requires simplifying constant for the type system `Tr::A`, completing the cycle
|
||||
note: cycle used when const-evaluating + checking `main::promoted[1]`
|
||||
note: cycle used when optimizing promoted MIR for `main`
|
||||
--> $DIR/defaults-cyclic-fail.rs:16:16
|
||||
|
|
||||
LL | assert_eq!(<() as Tr>::A, 0);
|
||||
|
@ -10,6 +10,14 @@ note: erroneous constant encountered
|
||||
LL | assert_eq!(<() as Tr>::B, 0); // causes the error above
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
note: erroneous constant encountered
|
||||
--> $DIR/defaults-not-assumed-fail.rs:33:16
|
||||
|
|
||||
LL | assert_eq!(<() as Tr>::B, 0); // causes the error above
|
||||
| ^^^^^^^^^^^^^
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
note: erroneous constant encountered
|
||||
--> $DIR/defaults-not-assumed-fail.rs:33:5
|
||||
|
|
||||
|
@ -1,48 +0,0 @@
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:19:13
|
||||
|
|
||||
LL | let a = -i8::MIN;
|
||||
| ^^^^^^^^ attempt to negate `i8::MIN`, which would overflow
|
||||
|
|
||||
= note: `#[deny(arithmetic_overflow)]` on by default
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:21:18
|
||||
|
|
||||
LL | let a_i128 = -i128::MIN;
|
||||
| ^^^^^^^^^^ attempt to negate `i128::MIN`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:23:13
|
||||
|
|
||||
LL | let b = 200u8 + 200u8 + 200u8;
|
||||
| ^^^^^^^^^^^^^ attempt to compute `200_u8 + 200_u8`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:25:18
|
||||
|
|
||||
LL | let b_i128 = i128::MIN - i128::MAX;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ attempt to compute `i128::MIN - i128::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:27:13
|
||||
|
|
||||
LL | let c = 200u8 * 4;
|
||||
| ^^^^^^^^^ attempt to compute `200_u8 * 4_u8`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:29:13
|
||||
|
|
||||
LL | let d = 42u8 - (42u8 + 1);
|
||||
| ^^^^^^^^^^^^^^^^^ attempt to compute `42_u8 - 43_u8`, which would overflow
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/const-err2.rs:31:14
|
||||
|
|
||||
LL | let _e = [5u8][1];
|
||||
| ^^^^^^^^ index out of bounds: the length is 1 but the index is 1
|
||||
|
|
||||
= note: `#[deny(unconditional_panic)]` on by default
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
@ -1,48 +0,0 @@
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:19:13
|
||||
|
|
||||
LL | let a = -i8::MIN;
|
||||
| ^^^^^^^^ attempt to negate `i8::MIN`, which would overflow
|
||||
|
|
||||
= note: `#[deny(arithmetic_overflow)]` on by default
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:21:18
|
||||
|
|
||||
LL | let a_i128 = -i128::MIN;
|
||||
| ^^^^^^^^^^ attempt to negate `i128::MIN`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:23:13
|
||||
|
|
||||
LL | let b = 200u8 + 200u8 + 200u8;
|
||||
| ^^^^^^^^^^^^^ attempt to compute `200_u8 + 200_u8`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:25:18
|
||||
|
|
||||
LL | let b_i128 = i128::MIN - i128::MAX;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ attempt to compute `i128::MIN - i128::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:27:13
|
||||
|
|
||||
LL | let c = 200u8 * 4;
|
||||
| ^^^^^^^^^ attempt to compute `200_u8 * 4_u8`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:29:13
|
||||
|
|
||||
LL | let d = 42u8 - (42u8 + 1);
|
||||
| ^^^^^^^^^^^^^^^^^ attempt to compute `42_u8 - 43_u8`, which would overflow
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/const-err2.rs:31:14
|
||||
|
|
||||
LL | let _e = [5u8][1];
|
||||
| ^^^^^^^^ index out of bounds: the length is 1 but the index is 1
|
||||
|
|
||||
= note: `#[deny(unconditional_panic)]` on by default
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
@ -1,48 +0,0 @@
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:19:13
|
||||
|
|
||||
LL | let a = -i8::MIN;
|
||||
| ^^^^^^^^ attempt to negate `i8::MIN`, which would overflow
|
||||
|
|
||||
= note: `#[deny(arithmetic_overflow)]` on by default
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:21:18
|
||||
|
|
||||
LL | let a_i128 = -i128::MIN;
|
||||
| ^^^^^^^^^^ attempt to negate `i128::MIN`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:23:13
|
||||
|
|
||||
LL | let b = 200u8 + 200u8 + 200u8;
|
||||
| ^^^^^^^^^^^^^ attempt to compute `200_u8 + 200_u8`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:25:18
|
||||
|
|
||||
LL | let b_i128 = i128::MIN - i128::MAX;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ attempt to compute `i128::MIN - i128::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:27:13
|
||||
|
|
||||
LL | let c = 200u8 * 4;
|
||||
| ^^^^^^^^^ attempt to compute `200_u8 * 4_u8`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/const-err2.rs:29:13
|
||||
|
|
||||
LL | let d = 42u8 - (42u8 + 1);
|
||||
| ^^^^^^^^^^^^^^^^^ attempt to compute `42_u8 - 43_u8`, which would overflow
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/const-err2.rs:31:14
|
||||
|
|
||||
LL | let _e = [5u8][1];
|
||||
| ^^^^^^^^ index out of bounds: the length is 1 but the index is 1
|
||||
|
|
||||
= note: `#[deny(unconditional_panic)]` on by default
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
@ -1,39 +0,0 @@
|
||||
// needed because negating int::MIN will behave differently between
|
||||
// optimized compilation and unoptimized compilation and thus would
|
||||
// lead to different lints being emitted
|
||||
|
||||
//@ revisions: noopt opt opt_with_overflow_checks
|
||||
//@[noopt]compile-flags: -C opt-level=0
|
||||
//@[opt]compile-flags: -O
|
||||
//@[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O
|
||||
|
||||
//@ build-fail
|
||||
|
||||
#![feature(rustc_attrs)]
|
||||
|
||||
fn black_box<T>(_: T) {
|
||||
unimplemented!()
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let a = -i8::MIN;
|
||||
//~^ ERROR arithmetic operation will overflow
|
||||
let a_i128 = -i128::MIN;
|
||||
//~^ ERROR arithmetic operation will overflow
|
||||
let b = 200u8 + 200u8 + 200u8;
|
||||
//~^ ERROR arithmetic operation will overflow
|
||||
let b_i128 = i128::MIN - i128::MAX;
|
||||
//~^ ERROR arithmetic operation will overflow
|
||||
let c = 200u8 * 4;
|
||||
//~^ ERROR arithmetic operation will overflow
|
||||
let d = 42u8 - (42u8 + 1);
|
||||
//~^ ERROR arithmetic operation will overflow
|
||||
let _e = [5u8][1];
|
||||
//~^ ERROR operation will panic
|
||||
black_box(a);
|
||||
black_box(a_i128);
|
||||
black_box(b);
|
||||
black_box(b_i128);
|
||||
black_box(c);
|
||||
black_box(d);
|
||||
}
|
@ -10,6 +10,14 @@ note: erroneous constant encountered
|
||||
LL | println!("{}", <Bar<u16, u8> as Foo>::AMT);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
note: erroneous constant encountered
|
||||
--> $DIR/issue-44578.rs:25:20
|
||||
|
|
||||
LL | println!("{}", <Bar<u16, u8> as Foo>::AMT);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
note: erroneous constant encountered
|
||||
--> $DIR/issue-44578.rs:25:20
|
||||
|
|
||||
|
@ -14,6 +14,7 @@ struct Sum<A, B>(A, B);
|
||||
impl<A: Unsigned, B: Unsigned> Unsigned for Sum<A, B> {
|
||||
const MAX: u8 = A::MAX + B::MAX;
|
||||
//~^ ERROR evaluation of `<Sum<U8, U8> as Unsigned>::MAX` failed
|
||||
//~| ERROR evaluation of `<Sum<U8, U8> as Unsigned>::MAX` failed
|
||||
}
|
||||
|
||||
fn foo<T>(_: T) -> &'static u8 {
|
||||
|
@ -5,17 +5,33 @@ LL | const MAX: u8 = A::MAX + B::MAX;
|
||||
| ^^^^^^^^^^^^^^^ attempt to compute `u8::MAX + u8::MAX`, which would overflow
|
||||
|
||||
note: erroneous constant encountered
|
||||
--> $DIR/issue-50814.rs:20:6
|
||||
--> $DIR/issue-50814.rs:21:6
|
||||
|
|
||||
LL | &Sum::<U8, U8>::MAX
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0080]: evaluation of `<Sum<U8, U8> as Unsigned>::MAX` failed
|
||||
--> $DIR/issue-50814.rs:15:21
|
||||
|
|
||||
LL | const MAX: u8 = A::MAX + B::MAX;
|
||||
| ^^^^^^^^^^^^^^^ attempt to compute `u8::MAX + u8::MAX`, which would overflow
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
note: erroneous constant encountered
|
||||
--> $DIR/issue-50814.rs:21:6
|
||||
|
|
||||
LL | &Sum::<U8, U8>::MAX
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
note: the above error was encountered while instantiating `fn foo::<i32>`
|
||||
--> $DIR/issue-50814.rs:25:5
|
||||
--> $DIR/issue-50814.rs:26:5
|
||||
|
|
||||
LL | foo(0);
|
||||
| ^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
||||
|
1023
tests/ui/consts/overflowing-consts.noopt.stderr
Normal file
1023
tests/ui/consts/overflowing-consts.noopt.stderr
Normal file
File diff suppressed because it is too large
Load Diff
1023
tests/ui/consts/overflowing-consts.opt.stderr
Normal file
1023
tests/ui/consts/overflowing-consts.opt.stderr
Normal file
File diff suppressed because it is too large
Load Diff
1023
tests/ui/consts/overflowing-consts.opt_with_overflow_checks.stderr
Normal file
1023
tests/ui/consts/overflowing-consts.opt_with_overflow_checks.stderr
Normal file
File diff suppressed because it is too large
Load Diff
288
tests/ui/consts/overflowing-consts.rs
Normal file
288
tests/ui/consts/overflowing-consts.rs
Normal file
@ -0,0 +1,288 @@
|
||||
// Tests that overflowing or bound-exceeding operations
|
||||
// for compile-time consts raise errors
|
||||
|
||||
//@ revisions: noopt opt opt_with_overflow_checks
|
||||
//@ [noopt]compile-flags: -C opt-level=0
|
||||
//@ [opt]compile-flags: -O
|
||||
//@ [opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O
|
||||
//@ ignore-pass (test tests codegen-time behaviour)
|
||||
//@ normalize-stderr-test "shift left by `(64|32)_usize`, which" -> "shift left by `%BITS%`, which"
|
||||
//@ normalize-stderr-test "shift right by `(64|32)_usize`, which" -> "shift right by `%BITS%`, which"
|
||||
|
||||
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
const BITS: usize = 32;
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
const BITS: usize = 64;
|
||||
|
||||
// Shift left
|
||||
const _NI8_SHL: i8 = 1i8 << 8; //~ ERROR: evaluation of constant value failed
|
||||
const _NI8_SHL_P: &i8 = &(1i8 << 8); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI16_SHL: i16 = 1i16 << 16; //~ ERROR: evaluation of constant value failed
|
||||
const _NI16_SHL_P: &i16 = &(1i16 << 16); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI32_SHL: i32 = 1i32 << 32; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_SHL_P: &i32 = &(1i32 << 32); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI64_SHL: i64 = 1i64 << 64; //~ ERROR: evaluation of constant value failed
|
||||
const _NI64_SHL_P: &i64 = &(1i64 << 64); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI128_SHL: i128 = 1i128 << 128; //~ ERROR: evaluation of constant value failed
|
||||
const _NI128_SHL_P: &i128 = &(1i128 << 128); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU8_SHL: u8 = 1u8 << 8; //~ ERROR: evaluation of constant value failed
|
||||
const _NU8_SHL_P: &u8 = &(1u8 << 8); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU16_SHL: u16 = 1u16 << 16; //~ ERROR: evaluation of constant value failed
|
||||
const _NU16_SHL_P: &u16 = &(1u16 << 16); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU32_SHL: u32 = 1u32 << 32; //~ ERROR: evaluation of constant value failed
|
||||
const _NU32_SHL_P: &u32 = &(1u32 << 32); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU64_SHL: u64 = 1u64 << 64; //~ ERROR: evaluation of constant value failed
|
||||
const _NU64_SHL_P: &u64 = &(1u64 << 64); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU128_SHL: u128 = 1u128 << 128; //~ ERROR: evaluation of constant value failed
|
||||
const _NU128_SHL_P: &u128 = &(1u128 << 128); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NISIZE_SHL: isize = 1isize << BITS; //~ ERROR: evaluation of constant value failed
|
||||
const _NISIZE_SHL_P: &isize = &(1isize << BITS); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NUSIZE_SHL: usize = 1usize << BITS; //~ ERROR: evaluation of constant value failed
|
||||
const _NUSIZE_SHL_P: &usize = &(1usize << BITS); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
|
||||
// Shift right
|
||||
const _NI8_SHR: i8 = 1i8 >> 8; //~ ERROR: evaluation of constant value failed
|
||||
const _NI8_SHR_P: &i8 = &(1i8 >> 8); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI16_SHR: i16 = 1i16 >> 16; //~ ERROR: evaluation of constant value failed
|
||||
const _NI16_SHR_P: &i16 = &(1i16 >> 16); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI32_SHR: i32 = 1i32 >> 32; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_SHR_P: &i32 = &(1i32 >> 32); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI64_SHR: i64 = 1i64 >> 64; //~ ERROR: evaluation of constant value failed
|
||||
const _NI64_SHR_P: &i64 = &(1i64 >> 64); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI128_SHR: i128 = 1i128 >> 128; //~ ERROR: evaluation of constant value failed
|
||||
const _NI128_SHR_P: &i128 = &(1i128 >> 128); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU8_SHR: u8 = 1u8 >> 8; //~ ERROR: evaluation of constant value failed
|
||||
const _NU8_SHR_P: &u8 = &(1u8 >> 8); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU16_SHR: u16 = 1u16 >> 16; //~ ERROR: evaluation of constant value failed
|
||||
const _NU16_SHR_P: &u16 = &(1u16 >> 16); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU32_SHR: u32 = 1u32 >> 32; //~ ERROR: evaluation of constant value failed
|
||||
const _NU32_SHR_P: &u32 = &(1u32 >> 32); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU64_SHR: u64 = 1u64 >> 64; //~ ERROR: evaluation of constant value failed
|
||||
const _NU64_SHR_P: &u64 = &(1u64 >> 64); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU128_SHR: u128 = 1u128 >> 128; //~ ERROR: evaluation of constant value failed
|
||||
const _NU128_SHR_P: &u128 = &(1u128 >> 128); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NISIZE_SHR: isize = 1isize >> BITS; //~ ERROR: evaluation of constant value failed
|
||||
const _NISIZE_SHR_P: &isize = &(1isize >> BITS); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NUSIZE_SHR: usize = 1usize >> BITS; //~ ERROR: evaluation of constant value failed
|
||||
const _NUSIZE_SHR_P: &usize = &(1usize >> BITS); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
|
||||
// Addition
|
||||
const _NI8_ADD: i8 = 1i8 + i8::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI8_ADD_P: &i8 = &(1i8 + i8::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI16_ADD: i16 = 1i16 + i16::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI16_ADD_P: &i16 = &(1i16 + i16::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI32_ADD: i32 = 1i32 + i32::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_ADD_P: &i32 = &(1i32 + i32::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI64_ADD: i64 = 1i64 + i64::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI64_ADD_P: &i64 = &(1i64 + i64::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI128_ADD: i128 = 1i128 + i128::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI128_ADD_P: &i128 = &(1i128 + i128::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU8_ADD: u8 = 1u8 + u8::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NU8_ADD_P: &u8 = &(1u8 + u8::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU16_ADD: u16 = 1u16 + u16::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NU16_ADD_P: &u16 = &(1u16 + u16::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU32_ADD: u32 = 1u32 + u32::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NU32_ADD_P: &u32 = &(1u32 + u32::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU64_ADD: u64 = 1u64 + u64::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NU64_ADD_P: &u64 = &(1u64 + u64::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU128_ADD: u128 = 1u128 + u128::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NU128_ADD_P: &u128 = &(1u128 + u128::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NISIZE_ADD: isize = 1isize + isize::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NISIZE_ADD_P: &isize = &(1isize + isize::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NUSIZE_ADD: usize = 1usize + usize::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NUSIZE_ADD_P: &usize = &(1usize + usize::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
|
||||
// Subtraction
|
||||
const _NI8_SUB: i8 = -5i8 - i8::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI8_SUB_P: &i8 = &(-5i8 - i8::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI16_SUB: i16 = -5i16 - i16::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI16_SUB_P: &i16 = &(-5i16 - i16::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI32_SUB: i32 = -5i32 - i32::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_SUB_P: &i32 = &(-5i32 - i32::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI64_SUB: i64 = -5i64 - i64::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI64_SUB_P: &i64 = &(-5i64 - i64::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI128_SUB: i128 = -5i128 - i128::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NI128_SUB_P: &i128 = &(-5i128 - i128::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU8_SUB: u8 = 1u8 - 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU8_SUB_P: &u8 = &(1u8 - 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU16_SUB: u16 = 1u16 - 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU16_SUB_P: &u16 = &(1u16 - 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU32_SUB: u32 = 1u32 - 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU32_SUB_P: &u32 = &(1u32 - 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU64_SUB: u64 = 1u64 - 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU64_SUB_P: &u64 = &(1u64 - 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU128_SUB: u128 = 1u128 - 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU128_SUB_P: &u128 = &(1u128 - 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NISIZE_SUB: isize = -5isize - isize::MAX; //~ ERROR: evaluation of constant value failed
|
||||
const _NISIZE_SUB_P: &isize = &(-5isize - isize::MAX); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NUSIZE_SUB: usize = 1usize - 5 ; //~ ERROR: evaluation of constant value failed
|
||||
const _NUSIZE_SUB_P: &usize = &(1usize - 5 ); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
|
||||
// Multiplication
|
||||
const _NI8_MUL: i8 = i8::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NI8_MUL_P: &i8 = &(i8::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI16_MUL: i16 = i16::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NI16_MUL_P: &i16 = &(i16::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI32_MUL: i32 = i32::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_MUL_P: &i32 = &(i32::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI64_MUL: i64 = i64::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NI64_MUL_P: &i64 = &(i64::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI128_MUL: i128 = i128::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NI128_MUL_P: &i128 = &(i128::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU8_MUL: u8 = u8::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU8_MUL_P: &u8 = &(u8::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU16_MUL: u16 = u16::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU16_MUL_P: &u16 = &(u16::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU32_MUL: u32 = u32::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU32_MUL_P: &u32 = &(u32::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU64_MUL: u64 = u64::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU64_MUL_P: &u64 = &(u64::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU128_MUL: u128 = u128::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NU128_MUL_P: &u128 = &(u128::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NISIZE_MUL: isize = isize::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NISIZE_MUL_P: &isize = &(isize::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NUSIZE_MUL: usize = usize::MAX * 5; //~ ERROR: evaluation of constant value failed
|
||||
const _NUSIZE_MUL_P: &usize = &(usize::MAX * 5); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
|
||||
// Division
|
||||
const _NI8_DIV: i8 = 1i8 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI8_DIV_P: &i8 = &(1i8 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI16_DIV: i16 = 1i16 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI16_DIV_P: &i16 = &(1i16 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI32_DIV: i32 = 1i32 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_DIV_P: &i32 = &(1i32 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI64_DIV: i64 = 1i64 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI64_DIV_P: &i64 = &(1i64 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI128_DIV: i128 = 1i128 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI128_DIV_P: &i128 = &(1i128 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU8_DIV: u8 = 1u8 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU8_DIV_P: &u8 = &(1u8 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU16_DIV: u16 = 1u16 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU16_DIV_P: &u16 = &(1u16 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU32_DIV: u32 = 1u32 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU32_DIV_P: &u32 = &(1u32 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU64_DIV: u64 = 1u64 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU64_DIV_P: &u64 = &(1u64 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU128_DIV: u128 = 1u128 / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU128_DIV_P: &u128 = &(1u128 / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NISIZE_DIV: isize = 1isize / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NISIZE_DIV_P: &isize = &(1isize / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NUSIZE_DIV: usize = 1usize / 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NUSIZE_DIV_P: &usize = &(1usize / 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
// Modulus
|
||||
const _NI8_MOD: i8 = 1i8 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI8_MOD_P: &i8 = &(1i8 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI16_MOD: i16 = 1i16 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI16_MOD_P: &i16 = &(1i16 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI32_MOD: i32 = 1i32 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_MOD_P: &i32 = &(1i32 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI64_MOD: i64 = 1i64 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI64_MOD_P: &i64 = &(1i64 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NI128_MOD: i128 = 1i128 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NI128_MOD_P: &i128 = &(1i128 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU8_MOD: u8 = 1u8 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU8_MOD_P: &u8 = &(1u8 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU16_MOD: u16 = 1u16 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU16_MOD_P: &u16 = &(1u16 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU32_MOD: u32 = 1u32 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU32_MOD_P: &u32 = &(1u32 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU64_MOD: u64 = 1u64 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU64_MOD_P: &u64 = &(1u64 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NU128_MOD: u128 = 1u128 % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NU128_MOD_P: &u128 = &(1u128 % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NISIZE_MOD: isize = 1isize % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NISIZE_MOD_P: &isize = &(1isize % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
const _NUSIZE_MOD: usize = 1usize % 0; //~ ERROR: evaluation of constant value failed
|
||||
const _NUSIZE_MOD_P: &usize = &(1usize % 0); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
|
||||
// Out of bounds access
|
||||
const _NI32_OOB: i32 = [1, 2, 3][4]; //~ ERROR: evaluation of constant value failed
|
||||
const _NI32_OOB_P: &i32 = &([1, 2, 3][4]); //~ ERROR: evaluation of constant value failed
|
||||
|
||||
|
||||
pub fn main() {}
|
@ -25,9 +25,8 @@ fn main() {
|
||||
assert_static(&["d", "e", "f"]);
|
||||
assert_eq!(C, 42);
|
||||
|
||||
// make sure that these do not cause trouble despite overflowing
|
||||
// make sure that this does not cause trouble despite overflowing
|
||||
assert_static(&(0-1));
|
||||
assert_static(&-i32::MIN);
|
||||
|
||||
// div-by-non-0 is okay
|
||||
assert_static(&(1/1));
|
||||
|
54
tests/ui/lint/issue-117949.noopt.stderr
Normal file
54
tests/ui/lint/issue-117949.noopt.stderr
Normal file
@ -0,0 +1,54 @@
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:16:24
|
||||
|
|
||||
LL | format_args!("{}", 5 * i32::MAX);
|
||||
| ^^^^^^^^^^^^ attempt to compute `5_i32 * i32::MAX`, which would overflow
|
||||
|
|
||||
= note: `#[deny(arithmetic_overflow)]` on by default
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:15:24
|
||||
|
|
||||
LL | format_args!("{}", -5 - i32::MAX);
|
||||
| ^^^^^^^^^^^^^ attempt to compute `-5_i32 - i32::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:14:24
|
||||
|
|
||||
LL | format_args!("{}", 1 + i32::MAX);
|
||||
| ^^^^^^^^^^^^ attempt to compute `1_i32 + i32::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:13:24
|
||||
|
|
||||
LL | format_args!("{}", 1 >> 32);
|
||||
| ^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:12:24
|
||||
|
|
||||
LL | format_args!("{}", 1 << 32);
|
||||
| ^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:17:24
|
||||
|
|
||||
LL | format_args!("{}", 1 / 0);
|
||||
| ^^^^^ attempt to divide `1_i32` by zero
|
||||
|
|
||||
= note: `#[deny(unconditional_panic)]` on by default
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:18:24
|
||||
|
|
||||
LL | format_args!("{}", 1 % 0);
|
||||
| ^^^^^ attempt to calculate the remainder of `1_i32` with a divisor of zero
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:19:24
|
||||
|
|
||||
LL | format_args!("{}", [1, 2, 3][4]);
|
||||
| ^^^^^^^^^^^^ index out of bounds: the length is 3 but the index is 4
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
54
tests/ui/lint/issue-117949.opt.stderr
Normal file
54
tests/ui/lint/issue-117949.opt.stderr
Normal file
@ -0,0 +1,54 @@
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:16:24
|
||||
|
|
||||
LL | format_args!("{}", 5 * i32::MAX);
|
||||
| ^^^^^^^^^^^^ attempt to compute `5_i32 * i32::MAX`, which would overflow
|
||||
|
|
||||
= note: `#[deny(arithmetic_overflow)]` on by default
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:15:24
|
||||
|
|
||||
LL | format_args!("{}", -5 - i32::MAX);
|
||||
| ^^^^^^^^^^^^^ attempt to compute `-5_i32 - i32::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:14:24
|
||||
|
|
||||
LL | format_args!("{}", 1 + i32::MAX);
|
||||
| ^^^^^^^^^^^^ attempt to compute `1_i32 + i32::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:13:24
|
||||
|
|
||||
LL | format_args!("{}", 1 >> 32);
|
||||
| ^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:12:24
|
||||
|
|
||||
LL | format_args!("{}", 1 << 32);
|
||||
| ^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:17:24
|
||||
|
|
||||
LL | format_args!("{}", 1 / 0);
|
||||
| ^^^^^ attempt to divide `1_i32` by zero
|
||||
|
|
||||
= note: `#[deny(unconditional_panic)]` on by default
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:18:24
|
||||
|
|
||||
LL | format_args!("{}", 1 % 0);
|
||||
| ^^^^^ attempt to calculate the remainder of `1_i32` with a divisor of zero
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:19:24
|
||||
|
|
||||
LL | format_args!("{}", [1, 2, 3][4]);
|
||||
| ^^^^^^^^^^^^ index out of bounds: the length is 3 but the index is 4
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
54
tests/ui/lint/issue-117949.opt_with_overflow_checks.stderr
Normal file
54
tests/ui/lint/issue-117949.opt_with_overflow_checks.stderr
Normal file
@ -0,0 +1,54 @@
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:16:24
|
||||
|
|
||||
LL | format_args!("{}", 5 * i32::MAX);
|
||||
| ^^^^^^^^^^^^ attempt to compute `5_i32 * i32::MAX`, which would overflow
|
||||
|
|
||||
= note: `#[deny(arithmetic_overflow)]` on by default
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:15:24
|
||||
|
|
||||
LL | format_args!("{}", -5 - i32::MAX);
|
||||
| ^^^^^^^^^^^^^ attempt to compute `-5_i32 - i32::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:14:24
|
||||
|
|
||||
LL | format_args!("{}", 1 + i32::MAX);
|
||||
| ^^^^^^^^^^^^ attempt to compute `1_i32 + i32::MAX`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:13:24
|
||||
|
|
||||
LL | format_args!("{}", 1 >> 32);
|
||||
| ^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
error: this arithmetic operation will overflow
|
||||
--> $DIR/issue-117949.rs:12:24
|
||||
|
|
||||
LL | format_args!("{}", 1 << 32);
|
||||
| ^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:17:24
|
||||
|
|
||||
LL | format_args!("{}", 1 / 0);
|
||||
| ^^^^^ attempt to divide `1_i32` by zero
|
||||
|
|
||||
= note: `#[deny(unconditional_panic)]` on by default
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:18:24
|
||||
|
|
||||
LL | format_args!("{}", 1 % 0);
|
||||
| ^^^^^ attempt to calculate the remainder of `1_i32` with a divisor of zero
|
||||
|
||||
error: this operation will panic at runtime
|
||||
--> $DIR/issue-117949.rs:19:24
|
||||
|
|
||||
LL | format_args!("{}", [1, 2, 3][4]);
|
||||
| ^^^^^^^^^^^^ index out of bounds: the length is 3 but the index is 4
|
||||
|
||||
error: aborting due to 8 previous errors
|
||||
|
20
tests/ui/lint/issue-117949.rs
Normal file
20
tests/ui/lint/issue-117949.rs
Normal file
@ -0,0 +1,20 @@
|
||||
// Regression test for issue #117949
|
||||
|
||||
//@ revisions: noopt opt opt_with_overflow_checks
|
||||
//@ [noopt]compile-flags: -C opt-level=0 -Z deduplicate-diagnostics=yes
|
||||
//@ [opt]compile-flags: -O
|
||||
//@ [opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O -Z deduplicate-diagnostics=yes
|
||||
//@ build-fail
|
||||
//@ ignore-pass (test tests codegen-time behaviour)
|
||||
|
||||
|
||||
fn main() {
|
||||
format_args!("{}", 1 << 32); //~ ERROR: arithmetic operation will overflow
|
||||
format_args!("{}", 1 >> 32); //~ ERROR: arithmetic operation will overflow
|
||||
format_args!("{}", 1 + i32::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
format_args!("{}", -5 - i32::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
format_args!("{}", 5 * i32::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
format_args!("{}", 1 / 0); //~ ERROR: this operation will panic at runtime
|
||||
format_args!("{}", 1 % 0); //~ ERROR: this operation will panic at runtime
|
||||
format_args!("{}", [1, 2, 3][4]); //~ ERROR: this operation will panic at runtime
|
||||
}
|
@ -1,152 +0,0 @@
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:18:20
|
||||
|
|
||||
LL | const N: i32 = T::N << 42;
|
||||
| ^^^^^^^^^^ attempt to shift left by `42_i32`, which would overflow
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:10:9
|
||||
|
|
||||
LL | #![warn(arithmetic_overflow)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:22:13
|
||||
|
|
||||
LL | let _ = x << 42;
|
||||
| ^^^^^^^ attempt to shift left by `42_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:27:15
|
||||
|
|
||||
LL | let n = 1u8 << 8;
|
||||
| ^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:29:15
|
||||
|
|
||||
LL | let n = 1u16 << 16;
|
||||
| ^^^^^^^^^^ attempt to shift left by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:31:15
|
||||
|
|
||||
LL | let n = 1u32 << 32;
|
||||
| ^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:33:15
|
||||
|
|
||||
LL | let n = 1u64 << 64;
|
||||
| ^^^^^^^^^^ attempt to shift left by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:35:15
|
||||
|
|
||||
LL | let n = 1i8 << 8;
|
||||
| ^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:37:15
|
||||
|
|
||||
LL | let n = 1i16 << 16;
|
||||
| ^^^^^^^^^^ attempt to shift left by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:39:15
|
||||
|
|
||||
LL | let n = 1i32 << 32;
|
||||
| ^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:41:15
|
||||
|
|
||||
LL | let n = 1i64 << 64;
|
||||
| ^^^^^^^^^^ attempt to shift left by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:44:15
|
||||
|
|
||||
LL | let n = 1u8 >> 8;
|
||||
| ^^^^^^^^ attempt to shift right by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:46:15
|
||||
|
|
||||
LL | let n = 1u16 >> 16;
|
||||
| ^^^^^^^^^^ attempt to shift right by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:48:15
|
||||
|
|
||||
LL | let n = 1u32 >> 32;
|
||||
| ^^^^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:50:15
|
||||
|
|
||||
LL | let n = 1u64 >> 64;
|
||||
| ^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:52:15
|
||||
|
|
||||
LL | let n = 1i8 >> 8;
|
||||
| ^^^^^^^^ attempt to shift right by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:54:15
|
||||
|
|
||||
LL | let n = 1i16 >> 16;
|
||||
| ^^^^^^^^^^ attempt to shift right by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:56:15
|
||||
|
|
||||
LL | let n = 1i32 >> 32;
|
||||
| ^^^^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:58:15
|
||||
|
|
||||
LL | let n = 1i64 >> 64;
|
||||
| ^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:62:15
|
||||
|
|
||||
LL | let n = n << 8;
|
||||
| ^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:64:15
|
||||
|
|
||||
LL | let n = 1u8 << -8;
|
||||
| ^^^^^^^^^ attempt to shift left by `-8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:69:15
|
||||
|
|
||||
LL | let n = 1u8 << (4+4);
|
||||
| ^^^^^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:71:15
|
||||
|
|
||||
LL | let n = 1i64 >> [64][0];
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:77:15
|
||||
|
|
||||
LL | let n = 1_isize << BITS;
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift left by `%BITS%`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:78:15
|
||||
|
|
||||
LL | let n = 1_usize << BITS;
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift left by `%BITS%`, which would overflow
|
||||
|
||||
warning: 24 warnings emitted
|
||||
|
@ -1,152 +0,0 @@
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:18:20
|
||||
|
|
||||
LL | const N: i32 = T::N << 42;
|
||||
| ^^^^^^^^^^ attempt to shift left by `42_i32`, which would overflow
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:10:9
|
||||
|
|
||||
LL | #![warn(arithmetic_overflow)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:22:13
|
||||
|
|
||||
LL | let _ = x << 42;
|
||||
| ^^^^^^^ attempt to shift left by `42_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:27:15
|
||||
|
|
||||
LL | let n = 1u8 << 8;
|
||||
| ^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:29:15
|
||||
|
|
||||
LL | let n = 1u16 << 16;
|
||||
| ^^^^^^^^^^ attempt to shift left by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:31:15
|
||||
|
|
||||
LL | let n = 1u32 << 32;
|
||||
| ^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:33:15
|
||||
|
|
||||
LL | let n = 1u64 << 64;
|
||||
| ^^^^^^^^^^ attempt to shift left by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:35:15
|
||||
|
|
||||
LL | let n = 1i8 << 8;
|
||||
| ^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:37:15
|
||||
|
|
||||
LL | let n = 1i16 << 16;
|
||||
| ^^^^^^^^^^ attempt to shift left by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:39:15
|
||||
|
|
||||
LL | let n = 1i32 << 32;
|
||||
| ^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:41:15
|
||||
|
|
||||
LL | let n = 1i64 << 64;
|
||||
| ^^^^^^^^^^ attempt to shift left by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:44:15
|
||||
|
|
||||
LL | let n = 1u8 >> 8;
|
||||
| ^^^^^^^^ attempt to shift right by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:46:15
|
||||
|
|
||||
LL | let n = 1u16 >> 16;
|
||||
| ^^^^^^^^^^ attempt to shift right by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:48:15
|
||||
|
|
||||
LL | let n = 1u32 >> 32;
|
||||
| ^^^^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:50:15
|
||||
|
|
||||
LL | let n = 1u64 >> 64;
|
||||
| ^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:52:15
|
||||
|
|
||||
LL | let n = 1i8 >> 8;
|
||||
| ^^^^^^^^ attempt to shift right by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:54:15
|
||||
|
|
||||
LL | let n = 1i16 >> 16;
|
||||
| ^^^^^^^^^^ attempt to shift right by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:56:15
|
||||
|
|
||||
LL | let n = 1i32 >> 32;
|
||||
| ^^^^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:58:15
|
||||
|
|
||||
LL | let n = 1i64 >> 64;
|
||||
| ^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:62:15
|
||||
|
|
||||
LL | let n = n << 8;
|
||||
| ^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:64:15
|
||||
|
|
||||
LL | let n = 1u8 << -8;
|
||||
| ^^^^^^^^^ attempt to shift left by `-8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:69:15
|
||||
|
|
||||
LL | let n = 1u8 << (4+4);
|
||||
| ^^^^^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:71:15
|
||||
|
|
||||
LL | let n = 1i64 >> [64][0];
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:77:15
|
||||
|
|
||||
LL | let n = 1_isize << BITS;
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift left by `%BITS%`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:78:15
|
||||
|
|
||||
LL | let n = 1_usize << BITS;
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift left by `%BITS%`, which would overflow
|
||||
|
||||
warning: 24 warnings emitted
|
||||
|
@ -1,152 +0,0 @@
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:18:20
|
||||
|
|
||||
LL | const N: i32 = T::N << 42;
|
||||
| ^^^^^^^^^^ attempt to shift left by `42_i32`, which would overflow
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:10:9
|
||||
|
|
||||
LL | #![warn(arithmetic_overflow)]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:22:13
|
||||
|
|
||||
LL | let _ = x << 42;
|
||||
| ^^^^^^^ attempt to shift left by `42_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:27:15
|
||||
|
|
||||
LL | let n = 1u8 << 8;
|
||||
| ^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:29:15
|
||||
|
|
||||
LL | let n = 1u16 << 16;
|
||||
| ^^^^^^^^^^ attempt to shift left by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:31:15
|
||||
|
|
||||
LL | let n = 1u32 << 32;
|
||||
| ^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:33:15
|
||||
|
|
||||
LL | let n = 1u64 << 64;
|
||||
| ^^^^^^^^^^ attempt to shift left by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:35:15
|
||||
|
|
||||
LL | let n = 1i8 << 8;
|
||||
| ^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:37:15
|
||||
|
|
||||
LL | let n = 1i16 << 16;
|
||||
| ^^^^^^^^^^ attempt to shift left by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:39:15
|
||||
|
|
||||
LL | let n = 1i32 << 32;
|
||||
| ^^^^^^^^^^ attempt to shift left by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:41:15
|
||||
|
|
||||
LL | let n = 1i64 << 64;
|
||||
| ^^^^^^^^^^ attempt to shift left by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:44:15
|
||||
|
|
||||
LL | let n = 1u8 >> 8;
|
||||
| ^^^^^^^^ attempt to shift right by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:46:15
|
||||
|
|
||||
LL | let n = 1u16 >> 16;
|
||||
| ^^^^^^^^^^ attempt to shift right by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:48:15
|
||||
|
|
||||
LL | let n = 1u32 >> 32;
|
||||
| ^^^^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:50:15
|
||||
|
|
||||
LL | let n = 1u64 >> 64;
|
||||
| ^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:52:15
|
||||
|
|
||||
LL | let n = 1i8 >> 8;
|
||||
| ^^^^^^^^ attempt to shift right by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:54:15
|
||||
|
|
||||
LL | let n = 1i16 >> 16;
|
||||
| ^^^^^^^^^^ attempt to shift right by `16_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:56:15
|
||||
|
|
||||
LL | let n = 1i32 >> 32;
|
||||
| ^^^^^^^^^^ attempt to shift right by `32_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:58:15
|
||||
|
|
||||
LL | let n = 1i64 >> 64;
|
||||
| ^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:62:15
|
||||
|
|
||||
LL | let n = n << 8;
|
||||
| ^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:64:15
|
||||
|
|
||||
LL | let n = 1u8 << -8;
|
||||
| ^^^^^^^^^ attempt to shift left by `-8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:69:15
|
||||
|
|
||||
LL | let n = 1u8 << (4+4);
|
||||
| ^^^^^^^^^^^^ attempt to shift left by `8_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:71:15
|
||||
|
|
||||
LL | let n = 1i64 >> [64][0];
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift right by `64_i32`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:77:15
|
||||
|
|
||||
LL | let n = 1_isize << BITS;
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift left by `%BITS%`, which would overflow
|
||||
|
||||
warning: this arithmetic operation will overflow
|
||||
--> $DIR/lint-exceeding-bitshifts.rs:78:15
|
||||
|
|
||||
LL | let n = 1_usize << BITS;
|
||||
| ^^^^^^^^^^^^^^^ attempt to shift left by `%BITS%`, which would overflow
|
||||
|
||||
warning: 24 warnings emitted
|
||||
|
@ -1,79 +0,0 @@
|
||||
//@ revisions: noopt opt opt_with_overflow_checks
|
||||
//@[noopt]compile-flags: -C opt-level=0
|
||||
//@[opt]compile-flags: -O
|
||||
//@[opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O
|
||||
//@ build-pass
|
||||
//@ ignore-pass (test emits codegen-time warnings and verifies that they are not errors)
|
||||
//@ normalize-stderr-test "shift left by `(64|32)_usize`, which" -> "shift left by `%BITS%`, which"
|
||||
|
||||
#![crate_type="lib"]
|
||||
#![warn(arithmetic_overflow)]
|
||||
|
||||
|
||||
pub trait Foo {
|
||||
const N: i32;
|
||||
}
|
||||
|
||||
impl<T: Foo> Foo for Vec<T> {
|
||||
const N: i32 = T::N << 42; //~ WARN: arithmetic operation will overflow
|
||||
}
|
||||
|
||||
pub fn foo(x: i32) {
|
||||
let _ = x << 42; //~ WARN: arithmetic operation will overflow
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
let n = 1u8 << 7;
|
||||
let n = 1u8 << 8; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1u16 << 15;
|
||||
let n = 1u16 << 16; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1u32 << 31;
|
||||
let n = 1u32 << 32; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1u64 << 63;
|
||||
let n = 1u64 << 64; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i8 << 7;
|
||||
let n = 1i8 << 8; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i16 << 15;
|
||||
let n = 1i16 << 16; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i32 << 31;
|
||||
let n = 1i32 << 32; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i64 << 63;
|
||||
let n = 1i64 << 64; //~ WARN: arithmetic operation will overflow
|
||||
|
||||
let n = 1u8 >> 7;
|
||||
let n = 1u8 >> 8; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1u16 >> 15;
|
||||
let n = 1u16 >> 16; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1u32 >> 31;
|
||||
let n = 1u32 >> 32; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1u64 >> 63;
|
||||
let n = 1u64 >> 64; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i8 >> 7;
|
||||
let n = 1i8 >> 8; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i16 >> 15;
|
||||
let n = 1i16 >> 16; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i32 >> 31;
|
||||
let n = 1i32 >> 32; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i64 >> 63;
|
||||
let n = 1i64 >> 64; //~ WARN: arithmetic operation will overflow
|
||||
|
||||
let n = 1u8;
|
||||
let n = n << 7;
|
||||
let n = n << 8; //~ WARN: arithmetic operation will overflow
|
||||
|
||||
let n = 1u8 << -8; //~ WARN: arithmetic operation will overflow
|
||||
|
||||
let n = 1i8<<(1isize+-1);
|
||||
|
||||
let n = 1u8 << (4+3);
|
||||
let n = 1u8 << (4+4); //~ WARN: arithmetic operation will overflow
|
||||
let n = 1i64 >> [63][0];
|
||||
let n = 1i64 >> [64][0]; //~ WARN: arithmetic operation will overflow
|
||||
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
const BITS: usize = 32;
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
const BITS: usize = 64;
|
||||
let n = 1_isize << BITS; //~ WARN: arithmetic operation will overflow
|
||||
let n = 1_usize << BITS; //~ WARN: arithmetic operation will overflow
|
||||
}
|
1030
tests/ui/lint/lint-overflowing-ops.noopt.stderr
Normal file
1030
tests/ui/lint/lint-overflowing-ops.noopt.stderr
Normal file
File diff suppressed because it is too large
Load Diff
1030
tests/ui/lint/lint-overflowing-ops.opt.stderr
Normal file
1030
tests/ui/lint/lint-overflowing-ops.opt.stderr
Normal file
File diff suppressed because it is too large
Load Diff
1030
tests/ui/lint/lint-overflowing-ops.opt_with_overflow_checks.stderr
Normal file
1030
tests/ui/lint/lint-overflowing-ops.opt_with_overflow_checks.stderr
Normal file
File diff suppressed because it is too large
Load Diff
294
tests/ui/lint/lint-overflowing-ops.rs
Normal file
294
tests/ui/lint/lint-overflowing-ops.rs
Normal file
@ -0,0 +1,294 @@
|
||||
// Tests that overflowing or bound-exceeding operations
|
||||
// are correclty linted including when they are const promoted
|
||||
|
||||
// We are using "-Z deduplicate-diagnostics=yes" because different
|
||||
// build configurations emit different number of duplicate diagnostics
|
||||
// and this flag lets us test them all with a single .rs file like this
|
||||
|
||||
//@ revisions: noopt opt opt_with_overflow_checks
|
||||
//@ [noopt]compile-flags: -C opt-level=0 -Z deduplicate-diagnostics=yes
|
||||
//@ [opt]compile-flags: -O
|
||||
//@ [opt_with_overflow_checks]compile-flags: -C overflow-checks=on -O -Z deduplicate-diagnostics=yes
|
||||
//@ build-fail
|
||||
//@ ignore-pass (test tests codegen-time behaviour)
|
||||
//@ normalize-stderr-test "shift left by `(64|32)_usize`, which" -> "shift left by `%BITS%`, which"
|
||||
//@ normalize-stderr-test "shift right by `(64|32)_usize`, which" -> "shift right by `%BITS%`, which"
|
||||
|
||||
#![deny(arithmetic_overflow)]
|
||||
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
const BITS: usize = 32;
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
const BITS: usize = 64;
|
||||
|
||||
fn main() {
|
||||
// Shift left
|
||||
let _n = 1u8 << 8; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u8 << 8); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u16 << 16; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u16 << 16); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u32 << 32; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u32 << 32); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u64 << 64; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u64 << 64); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u128 << 128; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u128 << 128); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i8 << 8; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i8 << 8); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i16 << 16; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i16 << 16); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i32 << 32; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i32 << 32); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i64 << 64; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i64 << 64); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i128 << 128; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i128 << 128); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1_isize << BITS; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1_isize << BITS); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1_usize << BITS; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1_usize << BITS); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
|
||||
// Shift right
|
||||
let _n = 1u8 >> 8; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u8 >> 8); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u16 >> 16; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u16 >> 16); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u32 >> 32; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u32 >> 32); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u64 >> 64; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u64 >> 64); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u128 >> 128; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u128 >> 128); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i8 >> 8; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i8 >> 8); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i16 >> 16; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i16 >> 16); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i32 >> 32; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i32 >> 32); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i64 >> 64; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i64 >> 64); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i128 >> 128; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i128 >> 128); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1_isize >> BITS; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1_isize >> BITS); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1_usize >> BITS; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1_usize >> BITS); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
|
||||
// Addition
|
||||
let _n = 1u8 + u8::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u8 + u8::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u16 + u16::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u16 + u16::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u32 + u32::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u32 + u32::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u64 + u64::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u64 + u64::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u128 + u128::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u128 + u128::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i8 + i8::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i8 + i8::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i16 + i16::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i16 + i16::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i32 + i32::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i32 + i32::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i64 + i64::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i64 + i64::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1i128 + i128::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1i128 + i128::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1isize + isize::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1isize + isize::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1usize + usize::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1usize + usize::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
|
||||
// Subtraction
|
||||
let _n = 1u8 - 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u8 - 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u16 - 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u16 - 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u32 - 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u32 - 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u64 - 5 ; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u64 - 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1u128 - 5 ; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1u128 - 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = -5i8 - i8::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(-5i8 - i8::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = -5i16 - i16::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(-5i16 - i16::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = -5i32 - i32::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(-5i32 - i32::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = -5i64 - i64::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(-5i64 - i64::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = -5i128 - i128::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(-5i128 - i128::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = -5isize - isize::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(-5isize - isize::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = 1usize - 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(1usize - 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
|
||||
// Multiplication
|
||||
let _n = u8::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(u8::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = u16::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(u16::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = u32::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(u32::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = u64::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(u64::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = u128::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(u128::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = i8::MAX * i8::MAX; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(i8::MAX * i8::MAX); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = i16::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(i16::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = i32::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(i32::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = i64::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(i64::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = i128::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(i128::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = isize::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(isize::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
let _n = usize::MAX * 5; //~ ERROR: arithmetic operation will overflow
|
||||
let _n = &(usize::MAX * 5); //~ ERROR: arithmetic operation will overflow
|
||||
|
||||
|
||||
// Division
|
||||
let _n = 1u8 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u8 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u16 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u16 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u32 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u32 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u64 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u64 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u128 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u128 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i8 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i8 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i16 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i16 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i32 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i32 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i64 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i64 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i128 / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i128 / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1isize / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1isize / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1usize / 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1usize / 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
|
||||
// Modulus
|
||||
let _n = 1u8 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u8 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u16 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u16 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u32 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u32 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u64 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u64 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1u128 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1u128 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i8 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i8 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i16 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i16 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i32 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i32 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i64 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i64 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1i128 % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1i128 % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1isize % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1isize % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
let _n = 1usize % 0; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &(1usize % 0); //~ ERROR: this operation will panic at runtime
|
||||
|
||||
|
||||
// Out of bounds access
|
||||
let _n = [1, 2, 3][4]; //~ ERROR: this operation will panic at runtime
|
||||
let _n = &([1, 2, 3][4]); //~ ERROR: this operation will panic at runtime
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
//@ run-pass
|
||||
|
||||
//@ compile-flags: -O
|
||||
|
||||
fn main() {
|
||||
let x = &(0u32 - 1);
|
||||
assert_eq!(*x, u32::MAX)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user