From 8a878f07e974232863c8c8c143970dd8a370f751 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 9 May 2021 14:56:19 +0200 Subject: [PATCH] ensure failing promoteds in const/static bodies are handled correctly --- .../const-eval/promoted_errors.noopt.stderr | 10 ++++---- .../const-eval/promoted_errors.opt.stderr | 10 ++++---- ...ted_errors.opt_with_overflow_checks.stderr | 10 ++++---- .../ui/consts/const-eval/promoted_errors.rs | 24 ++++++++++++++++++- 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr b/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr index 6f266801bdb4a..77e7d48407186 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr +++ b/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(); @@ -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 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(); diff --git a/src/test/ui/consts/const-eval/promoted_errors.opt.stderr b/src/test/ui/consts/const-eval/promoted_errors.opt.stderr index 892f57bfdfc1b..6b17346e6ecd1 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.opt.stderr +++ b/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(); @@ -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 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(); diff --git a/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr b/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr index 6f266801bdb4a..77e7d48407186 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr +++ b/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.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(); @@ -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 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(); diff --git a/src/test/ui/consts/const-eval/promoted_errors.rs b/src/test/ui/consts/const-eval/promoted_errors.rs index 7840f67c216c0..5bafea1ed46bd 100644 --- a/src/test/ui/consts/const-eval/promoted_errors.rs +++ b/src/test/ui/consts/const-eval/promoted_errors.rs @@ -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; +}