From 8a878f07e974232863c8c8c143970dd8a370f751 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 9 May 2021 14:56:19 +0200 Subject: [PATCH 1/2] 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; +} From 7a01160ce484325b6de27cf56400039d1b2c3721 Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sun, 9 May 2021 16:07:00 +0200 Subject: [PATCH 2/2] more erroneous-const tests --- .../ui/consts/const-eval/erroneous-const.rs | 2 + .../consts/const-eval/erroneous-const.stderr | 6 +-- .../ui/consts/const-eval/erroneous-const2.rs | 21 +++++++++++ .../consts/const-eval/erroneous-const2.stderr | 37 +++++++++++++++++++ 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 src/test/ui/consts/const-eval/erroneous-const2.rs create mode 100644 src/test/ui/consts/const-eval/erroneous-const2.stderr diff --git a/src/test/ui/consts/const-eval/erroneous-const.rs b/src/test/ui/consts/const-eval/erroneous-const.rs index b79ce4a523f96..bee5a7cb3ba72 100644 --- a/src/test/ui/consts/const-eval/erroneous-const.rs +++ b/src/test/ui/consts/const-eval/erroneous-const.rs @@ -10,6 +10,8 @@ impl PrintName { const fn no_codegen() { if false { + // This bad constant is only used in dead code in a no-codegen function... and yet we still + // must make sure that the build fails. let _ = PrintName::::VOID; //~ERROR could not evaluate static initializer } } diff --git a/src/test/ui/consts/const-eval/erroneous-const.stderr b/src/test/ui/consts/const-eval/erroneous-const.stderr index 16ed596628bf5..7e2a60929c73d 100644 --- a/src/test/ui/consts/const-eval/erroneous-const.stderr +++ b/src/test/ui/consts/const-eval/erroneous-const.stderr @@ -27,16 +27,16 @@ LL | #![warn(const_err, unconditional_panic)] = note: for more information, see issue #71800 error[E0080]: could not evaluate static initializer - --> $DIR/erroneous-const.rs:13:17 + --> $DIR/erroneous-const.rs:15:17 | LL | let _ = PrintName::::VOID; | ^^^^^^^^^^^^^^^^^^^^ | | | referenced constant has errors - | inside `no_codegen::` at $DIR/erroneous-const.rs:13:17 + | inside `no_codegen::` at $DIR/erroneous-const.rs:15:17 ... LL | pub static FOO: () = no_codegen::(); - | ------------------- inside `FOO` at $DIR/erroneous-const.rs:17:22 + | ------------------- inside `FOO` at $DIR/erroneous-const.rs:19:22 error: aborting due to previous error; 2 warnings emitted diff --git a/src/test/ui/consts/const-eval/erroneous-const2.rs b/src/test/ui/consts/const-eval/erroneous-const2.rs new file mode 100644 index 0000000000000..aa0f093bf6293 --- /dev/null +++ b/src/test/ui/consts/const-eval/erroneous-const2.rs @@ -0,0 +1,21 @@ +//! Make sure we error on erroneous consts even if they are unused. +#![warn(const_err, unconditional_panic)] + +struct PrintName(T); +impl PrintName { + const VOID: () = [()][2]; //~WARN any use of this value will cause an error + //~^ WARN this operation will panic at runtime + //~| WARN this was previously accepted by the compiler but is being phased out +} + +pub static FOO: () = { + if false { + // This bad constant is only used in dead code in a static initializer... and yet we still + // must make sure that the build fails. + let _ = PrintName::::VOID; //~ERROR could not evaluate static initializer + } +}; + +fn main() { + FOO +} diff --git a/src/test/ui/consts/const-eval/erroneous-const2.stderr b/src/test/ui/consts/const-eval/erroneous-const2.stderr new file mode 100644 index 0000000000000..813d3ee249fb2 --- /dev/null +++ b/src/test/ui/consts/const-eval/erroneous-const2.stderr @@ -0,0 +1,37 @@ +warning: this operation will panic at runtime + --> $DIR/erroneous-const2.rs:6:22 + | +LL | const VOID: () = [()][2]; + | ^^^^^^^ index out of bounds: the length is 1 but the index is 2 + | +note: the lint level is defined here + --> $DIR/erroneous-const2.rs:2:20 + | +LL | #![warn(const_err, unconditional_panic)] + | ^^^^^^^^^^^^^^^^^^^ + +warning: any use of this value will cause an error + --> $DIR/erroneous-const2.rs:6:22 + | +LL | const VOID: () = [()][2]; + | -----------------^^^^^^^- + | | + | index out of bounds: the length is 1 but the index is 2 + | +note: the lint level is defined here + --> $DIR/erroneous-const2.rs:2:9 + | +LL | #![warn(const_err, 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 + +error[E0080]: could not evaluate static initializer + --> $DIR/erroneous-const2.rs:15:17 + | +LL | let _ = PrintName::::VOID; + | ^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors + +error: aborting due to previous error; 2 warnings emitted + +For more information about this error, try `rustc --explain E0080`.