error: this arithmetic operation will overflow
- --> $DIR/issue-69020.rs:15:20
+ --> $DIR/issue-69020.rs:21:22
|
-LL | const N: i32 = -i32::MIN + T::N;
- | ^^^^^^^^^ attempt to negate with overflow
+LL | const NEG: i32 = -i32::MIN + T::NEG;
+ | ^^^^^^^^^ attempt to negate with overflow
|
= note: `#[deny(overflow)]` on by default
-error: aborting due to previous error
+error: this arithmetic operation will overflow
+ --> $DIR/issue-69020.rs:23:22
+ |
+LL | const ADD: i32 = (i32::MAX+1) + T::ADD;
+ | ^^^^^^^^^^^^ attempt to add with overflow
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:25:22
+ |
+LL | const DIV: i32 = (1/0) + T::DIV;
+ | ^^^^^ attempt to divide by zero
+ |
+ = note: `#[deny(panic)]` on by default
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:27:22
+ |
+LL | const OOB: i32 = [1][1] + T::OOB;
+ | ^^^^^^ index out of bounds: the len is 1 but the index is 1
+
+error: aborting due to 4 previous errors
error: this arithmetic operation will overflow
- --> $DIR/issue-69020.rs:15:20
+ --> $DIR/issue-69020.rs:21:22
|
-LL | const N: i32 = -i32::MIN + T::N;
- | ^^^^^^^^^ attempt to negate with overflow
+LL | const NEG: i32 = -i32::MIN + T::NEG;
+ | ^^^^^^^^^ attempt to negate with overflow
|
= note: `#[deny(overflow)]` on by default
-error: aborting due to previous error
+error: this arithmetic operation will overflow
+ --> $DIR/issue-69020.rs:23:22
+ |
+LL | const ADD: i32 = (i32::MAX+1) + T::ADD;
+ | ^^^^^^^^^^^^ attempt to add with overflow
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:25:22
+ |
+LL | const DIV: i32 = (1/0) + T::DIV;
+ | ^^^^^ attempt to divide by zero
+ |
+ = note: `#[deny(panic)]` on by default
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:27:22
+ |
+LL | const OOB: i32 = [1][1] + T::OOB;
+ | ^^^^^^ index out of bounds: the len is 1 but the index is 1
+
+error: aborting due to 4 previous errors
error: this arithmetic operation will overflow
- --> $DIR/issue-69020.rs:15:20
+ --> $DIR/issue-69020.rs:21:22
|
-LL | const N: i32 = -i32::MIN + T::N;
- | ^^^^^^^^^ attempt to negate with overflow
+LL | const NEG: i32 = -i32::MIN + T::NEG;
+ | ^^^^^^^^^ attempt to negate with overflow
|
= note: `#[deny(overflow)]` on by default
-error: aborting due to previous error
+error: this arithmetic operation will overflow
+ --> $DIR/issue-69020.rs:23:22
+ |
+LL | const ADD: i32 = (i32::MAX+1) + T::ADD;
+ | ^^^^^^^^^^^^ attempt to add with overflow
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:25:22
+ |
+LL | const DIV: i32 = (1/0) + T::DIV;
+ | ^^^^^ attempt to divide by zero
+ |
+ = note: `#[deny(panic)]` on by default
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:27:22
+ |
+LL | const OOB: i32 = [1][1] + T::OOB;
+ | ^^^^^^ index out of bounds: the len is 1 but the index is 1
+
+error: aborting due to 4 previous errors
error: this arithmetic operation will overflow
- --> $DIR/issue-69020.rs:15:20
+ --> $DIR/issue-69020.rs:21:22
|
-LL | const N: i32 = -i32::MIN + T::N;
- | ^^^^^^^^^ attempt to negate with overflow
+LL | const NEG: i32 = -i32::MIN + T::NEG;
+ | ^^^^^^^^^ attempt to negate with overflow
|
= note: `#[deny(overflow)]` on by default
-error: aborting due to previous error
+error: this arithmetic operation will overflow
+ --> $DIR/issue-69020.rs:23:22
+ |
+LL | const ADD: i32 = (i32::MAX+1) + T::ADD;
+ | ^^^^^^^^^^^^ attempt to add with overflow
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:25:22
+ |
+LL | const DIV: i32 = (1/0) + T::DIV;
+ | ^^^^^ attempt to divide by zero
+ |
+ = note: `#[deny(panic)]` on by default
+
+error: this operation will panic at runtime
+ --> $DIR/issue-69020.rs:27:22
+ |
+LL | const OOB: i32 = [1][1] + T::OOB;
+ | ^^^^^^ index out of bounds: the len is 1 but the index is 1
+
+error: aborting due to 4 previous errors
use std::i32;
pub trait Foo {
- const N: i32;
+ const NEG: i32;
+ const ADD: i32;
+ const DIV: i32;
+ const OOB: i32;
}
+// These constants cannot be evaluated already (they depend on `T::N`), so
+// they can just be linted like normal run-time code. But codegen works
+// a bit different in const context, so this test makes sure that we still catch overflow.
impl<T: Foo> Foo for Vec<T> {
- const N: i32 = -i32::MIN + T::N;
+ const NEG: i32 = -i32::MIN + T::NEG;
//~^ ERROR arithmetic operation will overflow
+ const ADD: i32 = (i32::MAX+1) + T::ADD;
+ //~^ ERROR arithmetic operation will overflow
+ const DIV: i32 = (1/0) + T::DIV;
+ //~^ ERROR operation will panic
+ const OOB: i32 = [1][1] + T::OOB;
+ //~^ ERROR operation will panic
}