ensure failing promoteds in const/static bodies are handled correctly
This commit is contained in:
parent
d6d028369b
commit
8a878f07e9
@ -1,12 +1,12 @@
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/promoted_errors.rs:13:5
|
||||
--> $DIR/promoted_errors.rs:15:5
|
||||
|
|
||||
LL | 0 - 1
|
||||
| ^^^^^
|
||||
| |
|
||||
| attempt to compute `0_u32 - 1_u32`, which would overflow
|
||||
| inside `overflow` at $DIR/promoted_errors.rs:13:5
|
||||
| inside `X` at $DIR/promoted_errors.rs:33:29
|
||||
| inside `overflow` at $DIR/promoted_errors.rs:15:5
|
||||
| inside `X` at $DIR/promoted_errors.rs:38:29
|
||||
...
|
||||
LL | / const X: () = {
|
||||
LL | | let _x: &'static u32 = &overflow();
|
||||
@ -18,7 +18,7 @@ LL | | };
|
||||
| |__-
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/promoted_errors.rs:9:9
|
||||
--> $DIR/promoted_errors.rs:11:9
|
||||
|
|
||||
LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
|
||||
| ^^^^^^^^^
|
||||
@ -26,7 +26,7 @@ LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
|
||||
= note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
|
||||
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/promoted_errors.rs:33:28
|
||||
--> $DIR/promoted_errors.rs:38:28
|
||||
|
|
||||
LL | / const X: () = {
|
||||
LL | | let _x: &'static u32 = &overflow();
|
||||
|
@ -1,12 +1,12 @@
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/promoted_errors.rs:18:5
|
||||
--> $DIR/promoted_errors.rs:20:5
|
||||
|
|
||||
LL | 1 / 0
|
||||
| ^^^^^
|
||||
| |
|
||||
| attempt to divide `1_i32` by zero
|
||||
| inside `div_by_zero1` at $DIR/promoted_errors.rs:18:5
|
||||
| inside `X` at $DIR/promoted_errors.rs:36:29
|
||||
| inside `div_by_zero1` at $DIR/promoted_errors.rs:20:5
|
||||
| inside `X` at $DIR/promoted_errors.rs:41:29
|
||||
...
|
||||
LL | / const X: () = {
|
||||
LL | | let _x: &'static u32 = &overflow();
|
||||
@ -18,7 +18,7 @@ LL | | };
|
||||
| |__-
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/promoted_errors.rs:9:9
|
||||
--> $DIR/promoted_errors.rs:11:9
|
||||
|
|
||||
LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
|
||||
| ^^^^^^^^^
|
||||
@ -26,7 +26,7 @@ LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
|
||||
= note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
|
||||
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/promoted_errors.rs:36:28
|
||||
--> $DIR/promoted_errors.rs:41:28
|
||||
|
|
||||
LL | / const X: () = {
|
||||
LL | | let _x: &'static u32 = &overflow();
|
||||
|
@ -1,12 +1,12 @@
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/promoted_errors.rs:13:5
|
||||
--> $DIR/promoted_errors.rs:15:5
|
||||
|
|
||||
LL | 0 - 1
|
||||
| ^^^^^
|
||||
| |
|
||||
| attempt to compute `0_u32 - 1_u32`, which would overflow
|
||||
| inside `overflow` at $DIR/promoted_errors.rs:13:5
|
||||
| inside `X` at $DIR/promoted_errors.rs:33:29
|
||||
| inside `overflow` at $DIR/promoted_errors.rs:15:5
|
||||
| inside `X` at $DIR/promoted_errors.rs:38:29
|
||||
...
|
||||
LL | / const X: () = {
|
||||
LL | | let _x: &'static u32 = &overflow();
|
||||
@ -18,7 +18,7 @@ LL | | };
|
||||
| |__-
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/promoted_errors.rs:9:9
|
||||
--> $DIR/promoted_errors.rs:11:9
|
||||
|
|
||||
LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
|
||||
| ^^^^^^^^^
|
||||
@ -26,7 +26,7 @@ LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
|
||||
= note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
|
||||
|
||||
warning: any use of this value will cause an error
|
||||
--> $DIR/promoted_errors.rs:33:28
|
||||
--> $DIR/promoted_errors.rs:38:28
|
||||
|
|
||||
LL | / const X: () = {
|
||||
LL | | let _x: &'static u32 = &overflow();
|
||||
|
@ -6,6 +6,8 @@
|
||||
// build-pass
|
||||
// ignore-pass (test emits codegen-time warnings and verifies that they are not errors)
|
||||
|
||||
//! This test ensures that when we promote code that fails to evaluate, the build still succeeds.
|
||||
|
||||
#![warn(const_err, arithmetic_overflow, unconditional_panic)]
|
||||
|
||||
// The only way to have promoteds that fail is in `const fn` called from `const`/`static`.
|
||||
@ -29,6 +31,9 @@ const fn oob() -> i32 {
|
||||
[1, 2, 3][4]
|
||||
}
|
||||
|
||||
// An unused constant containing failing promoteds.
|
||||
// This should work as long as `const_err` can be turned into just a warning;
|
||||
// once it turns into a hard error, just remove `X`.
|
||||
const X: () = {
|
||||
let _x: &'static u32 = &overflow();
|
||||
//[opt_with_overflow_checks,noopt]~^ WARN any use of this value will cause an error
|
||||
@ -41,4 +46,21 @@ const X: () = {
|
||||
let _x: &'static i32 = &oob();
|
||||
};
|
||||
|
||||
fn main() {}
|
||||
const fn mk_false() -> bool { false }
|
||||
|
||||
// An actually used constant referencing failing promoteds in dead code.
|
||||
// This needs to always work.
|
||||
const Y: () = {
|
||||
if mk_false() {
|
||||
let _x: &'static u32 = &overflow();
|
||||
let _x: &'static i32 = &div_by_zero1();
|
||||
let _x: &'static i32 = &div_by_zero2();
|
||||
let _x: &'static i32 = &div_by_zero3();
|
||||
let _x: &'static i32 = &oob();
|
||||
}
|
||||
()
|
||||
};
|
||||
|
||||
fn main() {
|
||||
let _y = Y;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user