Auto merge of #119432 - gurry:117949-make-lint-run-on-promoteds, r=oli-obk
Make `ConstPropLint` lint run on promoteds Fixes #117949 wherein the lint didn't fire for the following promoteds: - SHL or SHR operators in a non-optimized build - any arithmetic operator in an optimized build What I have done here is simply enabled `ConstPropLint` to run on promoted bodies by removing the relevant `if` check. After this change _all_ promoted arithmetic operators will lint _in both non-optimized and optimized builds_. On the flip side programs containing the above mentioned overflowing promoteds that were accepted earlier will now be rejected. Hope that is okay from a backward compatibility standpoint. I have added tests covering all overflowing promoted & non-promoted ops for both compile-time and runtime operations and for optimized as well as non-optimized builds. I had to amend some existing tests to make them pass and had to delete a couple that were set to pass despite overflows. This PR increases the number of duplicate diagnostics emitted (because the same operator might get linted in both the promoted MIR and the main MIR). I hope that is an acceptable trade-off given that we now lint overflows much more comprehensively than earlier.
This commit is contained in:
commit
dfdbe30004
29 changed files with 6967 additions and 738 deletions
|
@ -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…
Add table
Reference in a new issue