Skip to content

Commit 8a878f0

Browse files
committed
ensure failing promoteds in const/static bodies are handled correctly
1 parent d6d0283 commit 8a878f0

File tree

4 files changed

+38
-16
lines changed

4 files changed

+38
-16
lines changed

src/test/ui/consts/const-eval/promoted_errors.noopt.stderr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
warning: any use of this value will cause an error
2-
--> $DIR/promoted_errors.rs:13:5
2+
--> $DIR/promoted_errors.rs:15:5
33
|
44
LL | 0 - 1
55
| ^^^^^
66
| |
77
| attempt to compute `0_u32 - 1_u32`, which would overflow
8-
| inside `overflow` at $DIR/promoted_errors.rs:13:5
9-
| inside `X` at $DIR/promoted_errors.rs:33:29
8+
| inside `overflow` at $DIR/promoted_errors.rs:15:5
9+
| inside `X` at $DIR/promoted_errors.rs:38:29
1010
...
1111
LL | / const X: () = {
1212
LL | | let _x: &'static u32 = &overflow();
@@ -18,15 +18,15 @@ LL | | };
1818
| |__-
1919
|
2020
note: the lint level is defined here
21-
--> $DIR/promoted_errors.rs:9:9
21+
--> $DIR/promoted_errors.rs:11:9
2222
|
2323
LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
2424
| ^^^^^^^^^
2525
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
2626
= note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
2727

2828
warning: any use of this value will cause an error
29-
--> $DIR/promoted_errors.rs:33:28
29+
--> $DIR/promoted_errors.rs:38:28
3030
|
3131
LL | / const X: () = {
3232
LL | | let _x: &'static u32 = &overflow();

src/test/ui/consts/const-eval/promoted_errors.opt.stderr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
warning: any use of this value will cause an error
2-
--> $DIR/promoted_errors.rs:18:5
2+
--> $DIR/promoted_errors.rs:20:5
33
|
44
LL | 1 / 0
55
| ^^^^^
66
| |
77
| attempt to divide `1_i32` by zero
8-
| inside `div_by_zero1` at $DIR/promoted_errors.rs:18:5
9-
| inside `X` at $DIR/promoted_errors.rs:36:29
8+
| inside `div_by_zero1` at $DIR/promoted_errors.rs:20:5
9+
| inside `X` at $DIR/promoted_errors.rs:41:29
1010
...
1111
LL | / const X: () = {
1212
LL | | let _x: &'static u32 = &overflow();
@@ -18,15 +18,15 @@ LL | | };
1818
| |__-
1919
|
2020
note: the lint level is defined here
21-
--> $DIR/promoted_errors.rs:9:9
21+
--> $DIR/promoted_errors.rs:11:9
2222
|
2323
LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
2424
| ^^^^^^^^^
2525
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
2626
= note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
2727

2828
warning: any use of this value will cause an error
29-
--> $DIR/promoted_errors.rs:36:28
29+
--> $DIR/promoted_errors.rs:41:28
3030
|
3131
LL | / const X: () = {
3232
LL | | let _x: &'static u32 = &overflow();

src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
warning: any use of this value will cause an error
2-
--> $DIR/promoted_errors.rs:13:5
2+
--> $DIR/promoted_errors.rs:15:5
33
|
44
LL | 0 - 1
55
| ^^^^^
66
| |
77
| attempt to compute `0_u32 - 1_u32`, which would overflow
8-
| inside `overflow` at $DIR/promoted_errors.rs:13:5
9-
| inside `X` at $DIR/promoted_errors.rs:33:29
8+
| inside `overflow` at $DIR/promoted_errors.rs:15:5
9+
| inside `X` at $DIR/promoted_errors.rs:38:29
1010
...
1111
LL | / const X: () = {
1212
LL | | let _x: &'static u32 = &overflow();
@@ -18,15 +18,15 @@ LL | | };
1818
| |__-
1919
|
2020
note: the lint level is defined here
21-
--> $DIR/promoted_errors.rs:9:9
21+
--> $DIR/promoted_errors.rs:11:9
2222
|
2323
LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
2424
| ^^^^^^^^^
2525
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
2626
= note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
2727

2828
warning: any use of this value will cause an error
29-
--> $DIR/promoted_errors.rs:33:28
29+
--> $DIR/promoted_errors.rs:38:28
3030
|
3131
LL | / const X: () = {
3232
LL | | let _x: &'static u32 = &overflow();

src/test/ui/consts/const-eval/promoted_errors.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
// build-pass
77
// ignore-pass (test emits codegen-time warnings and verifies that they are not errors)
88

9+
//! This test ensures that when we promote code that fails to evaluate, the build still succeeds.
10+
911
#![warn(const_err, arithmetic_overflow, unconditional_panic)]
1012

1113
// The only way to have promoteds that fail is in `const fn` called from `const`/`static`.
@@ -29,6 +31,9 @@ const fn oob() -> i32 {
2931
[1, 2, 3][4]
3032
}
3133

34+
// An unused constant containing failing promoteds.
35+
// This should work as long as `const_err` can be turned into just a warning;
36+
// once it turns into a hard error, just remove `X`.
3237
const X: () = {
3338
let _x: &'static u32 = &overflow();
3439
//[opt_with_overflow_checks,noopt]~^ WARN any use of this value will cause an error
@@ -41,4 +46,21 @@ const X: () = {
4146
let _x: &'static i32 = &oob();
4247
};
4348

44-
fn main() {}
49+
const fn mk_false() -> bool { false }
50+
51+
// An actually used constant referencing failing promoteds in dead code.
52+
// This needs to always work.
53+
const Y: () = {
54+
if mk_false() {
55+
let _x: &'static u32 = &overflow();
56+
let _x: &'static i32 = &div_by_zero1();
57+
let _x: &'static i32 = &div_by_zero2();
58+
let _x: &'static i32 = &div_by_zero3();
59+
let _x: &'static i32 = &oob();
60+
}
61+
()
62+
};
63+
64+
fn main() {
65+
let _y = Y;
66+
}

0 commit comments

Comments
 (0)