Skip to content

Commit

Permalink
ensure failing promoteds in const/static bodies are handled correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
RalfJung committed May 9, 2021
1 parent d6d0283 commit 8a878f0
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 16 deletions.
10 changes: 5 additions & 5 deletions src/test/ui/consts/const-eval/promoted_errors.noopt.stderr
@@ -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();
Expand All @@ -18,15 +18,15 @@ 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)]
| ^^^^^^^^^
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= 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();
Expand Down
10 changes: 5 additions & 5 deletions src/test/ui/consts/const-eval/promoted_errors.opt.stderr
@@ -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();
Expand All @@ -18,15 +18,15 @@ 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)]
| ^^^^^^^^^
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= 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();
Expand Down
@@ -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();
Expand All @@ -18,15 +18,15 @@ 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)]
| ^^^^^^^^^
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= 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();
Expand Down
24 changes: 23 additions & 1 deletion src/test/ui/consts/const-eval/promoted_errors.rs
Expand Up @@ -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`.
Expand All @@ -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
Expand All @@ -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;
}

0 comments on commit 8a878f0

Please sign in to comment.