1
Fork 0

Use better error message for hard errors in CTFE

Currently the same message is used for hard errors and soft errors. This
makes hard errors use a message that indicates the reality of the
situation correctly, since usage of the constant is never allowed when
there was a hard error evaluating it.
This commit is contained in:
Smitty 2021-06-15 19:16:10 -04:00
parent 60f1a2fc4b
commit 4fe4ff95f6
15 changed files with 58 additions and 97 deletions

View file

@ -157,7 +157,7 @@ impl<'tcx> ConstEvalErr<'tcx> {
tcx: TyCtxtAt<'tcx>, tcx: TyCtxtAt<'tcx>,
message: &str, message: &str,
emit: impl FnOnce(DiagnosticBuilder<'_>), emit: impl FnOnce(DiagnosticBuilder<'_>),
mut lint_root: Option<hir::HirId>, lint_root: Option<hir::HirId>,
) -> ErrorHandled { ) -> ErrorHandled {
let finish = |mut err: DiagnosticBuilder<'_>, span_msg: Option<String>| { let finish = |mut err: DiagnosticBuilder<'_>, span_msg: Option<String>| {
trace!("reporting const eval failure at {:?}", self.span); trace!("reporting const eval failure at {:?}", self.span);
@ -194,12 +194,6 @@ impl<'tcx> ConstEvalErr<'tcx> {
_ => {} _ => {}
}; };
// If we have a 'hard error', then set `lint_root` to `None` so that we don't
// emit a lint.
if matches!(&self.error, InterpError::MachineStop(err) if err.is_hard_err()) {
lint_root = None;
}
let err_msg = self.error.to_string(); let err_msg = self.error.to_string();
// Regular case - emit a lint. // Regular case - emit a lint.

View file

@ -2,8 +2,8 @@ use super::{CompileTimeEvalContext, CompileTimeInterpreter, ConstEvalErr, Memory
use crate::interpret::eval_nullary_intrinsic; use crate::interpret::eval_nullary_intrinsic;
use crate::interpret::{ use crate::interpret::{
intern_const_alloc_recursive, Allocation, ConstAlloc, ConstValue, CtfeValidationMode, GlobalId, intern_const_alloc_recursive, Allocation, ConstAlloc, ConstValue, CtfeValidationMode, GlobalId,
Immediate, InternKind, InterpCx, InterpResult, MPlaceTy, MemoryKind, OpTy, RefTracking, Scalar, Immediate, InternKind, InterpCx, InterpError, InterpResult, MPlaceTy, MemoryKind, OpTy,
ScalarMaybeUninit, StackPopCleanup, RefTracking, Scalar, ScalarMaybeUninit, StackPopCleanup,
}; };
use crate::util::pretty::display_allocation; use crate::util::pretty::display_allocation;
@ -315,6 +315,7 @@ pub fn eval_to_allocation_raw_provider<'tcx>(
let emit_as_lint = if let Some(def) = def.as_local() { let emit_as_lint = if let Some(def) = def.as_local() {
// (Associated) consts only emit a lint, since they might be unused. // (Associated) consts only emit a lint, since they might be unused.
matches!(tcx.def_kind(def.did.to_def_id()), DefKind::Const | DefKind::AssocConst) matches!(tcx.def_kind(def.did.to_def_id()), DefKind::Const | DefKind::AssocConst)
&& !matches!(&err.error, InterpError::MachineStop(err) if err.is_hard_err())
} else { } else {
// use of broken constant from other crate: always an error // use of broken constant from other crate: always an error
false false

View file

@ -5,31 +5,31 @@
const MSG: &str = "hello"; const MSG: &str = "hello";
const Z: () = std::panic!("cheese"); const Z: () = std::panic!("cheese");
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const Z2: () = std::panic!(); const Z2: () = std::panic!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const Y: () = std::unreachable!(); const Y: () = std::unreachable!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const X: () = std::unimplemented!(); const X: () = std::unimplemented!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
// //
const W: () = std::panic!(MSG); const W: () = std::panic!(MSG);
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const Z_CORE: () = core::panic!("cheese"); const Z_CORE: () = core::panic!("cheese");
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const Z2_CORE: () = core::panic!(); const Z2_CORE: () = core::panic!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const Y_CORE: () = core::unreachable!(); const Y_CORE: () = core::unreachable!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const X_CORE: () = core::unimplemented!(); const X_CORE: () = core::unimplemented!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const W_CORE: () = core::panic!(MSG); const W_CORE: () = core::panic!(MSG);
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed

View file

@ -1,100 +1,80 @@
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:7:15 --> $DIR/const_panic.rs:7:15
| |
LL | const Z: () = std::panic!("cheese"); LL | const Z: () = std::panic!("cheese");
| --------------^^^^^^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'cheese', $DIR/const_panic.rs:7:15
| |
| the evaluated program panicked at 'cheese', $DIR/const_panic.rs:7:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:10:16 --> $DIR/const_panic.rs:10:16
| |
LL | const Z2: () = std::panic!(); LL | const Z2: () = std::panic!();
| ---------------^^^^^^^^^^^^^- | ^^^^^^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/const_panic.rs:10:16
| |
| the evaluated program panicked at 'explicit panic', $DIR/const_panic.rs:10:16
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:13:15 --> $DIR/const_panic.rs:13:15
| |
LL | const Y: () = std::unreachable!(); LL | const Y: () = std::unreachable!();
| --------------^^^^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic.rs:13:15
| |
| the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic.rs:13:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:16:15 --> $DIR/const_panic.rs:16:15
| |
LL | const X: () = std::unimplemented!(); LL | const X: () = std::unimplemented!();
| --------------^^^^^^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'not implemented', $DIR/const_panic.rs:16:15
| |
| the evaluated program panicked at 'not implemented', $DIR/const_panic.rs:16:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:19:15 --> $DIR/const_panic.rs:19:15
| |
LL | const W: () = std::panic!(MSG); LL | const W: () = std::panic!(MSG);
| --------------^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^ the evaluated program panicked at 'hello', $DIR/const_panic.rs:19:15
| |
| the evaluated program panicked at 'hello', $DIR/const_panic.rs:19:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:22:20 --> $DIR/const_panic.rs:22:20
| |
LL | const Z_CORE: () = core::panic!("cheese"); LL | const Z_CORE: () = core::panic!("cheese");
| -------------------^^^^^^^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'cheese', $DIR/const_panic.rs:22:20
| |
| the evaluated program panicked at 'cheese', $DIR/const_panic.rs:22:20
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:25:21 --> $DIR/const_panic.rs:25:21
| |
LL | const Z2_CORE: () = core::panic!(); LL | const Z2_CORE: () = core::panic!();
| --------------------^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/const_panic.rs:25:21
| |
| the evaluated program panicked at 'explicit panic', $DIR/const_panic.rs:25:21
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:28:20 --> $DIR/const_panic.rs:28:20
| |
LL | const Y_CORE: () = core::unreachable!(); LL | const Y_CORE: () = core::unreachable!();
| -------------------^^^^^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic.rs:28:20
| |
| the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic.rs:28:20
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:31:20 --> $DIR/const_panic.rs:31:20
| |
LL | const X_CORE: () = core::unimplemented!(); LL | const X_CORE: () = core::unimplemented!();
| -------------------^^^^^^^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'not implemented', $DIR/const_panic.rs:31:20
| |
| the evaluated program panicked at 'not implemented', $DIR/const_panic.rs:31:20
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic.rs:34:20 --> $DIR/const_panic.rs:34:20
| |
LL | const W_CORE: () = core::panic!(MSG); LL | const W_CORE: () = core::panic!(MSG);
| -------------------^^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^^ the evaluated program panicked at 'hello', $DIR/const_panic.rs:34:20
| |
| the evaluated program panicked at 'hello', $DIR/const_panic.rs:34:20
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -7,13 +7,13 @@
use core::panic::PanicInfo; use core::panic::PanicInfo;
const Z: () = panic!("cheese"); const Z: () = panic!("cheese");
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const Y: () = unreachable!(); const Y: () = unreachable!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
const X: () = unimplemented!(); const X: () = unimplemented!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
#[lang = "eh_personality"] #[lang = "eh_personality"]
fn eh() {} fn eh() {}

View file

@ -1,30 +1,24 @@
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic_libcore_bin.rs:9:15 --> $DIR/const_panic_libcore_bin.rs:9:15
| |
LL | const Z: () = panic!("cheese"); LL | const Z: () = panic!("cheese");
| --------------^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^ the evaluated program panicked at 'cheese', $DIR/const_panic_libcore_bin.rs:9:15
| |
| the evaluated program panicked at 'cheese', $DIR/const_panic_libcore_bin.rs:9:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic_libcore_bin.rs:12:15 --> $DIR/const_panic_libcore_bin.rs:12:15
| |
LL | const Y: () = unreachable!(); LL | const Y: () = unreachable!();
| --------------^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^ the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic_libcore_bin.rs:12:15
| |
| the evaluated program panicked at 'internal error: entered unreachable code', $DIR/const_panic_libcore_bin.rs:12:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/const_panic_libcore_bin.rs:15:15 --> $DIR/const_panic_libcore_bin.rs:15:15
| |
LL | const X: () = unimplemented!(); LL | const X: () = unimplemented!();
| --------------^^^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^^^ the evaluated program panicked at 'not implemented', $DIR/const_panic_libcore_bin.rs:15:15
| |
| the evaluated program panicked at 'not implemented', $DIR/const_panic_libcore_bin.rs:15:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -9,7 +9,7 @@ struct PrintName;
impl PrintName { impl PrintName {
const VOID: ! = panic!(); const VOID: ! = panic!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
} }
fn main() { fn main() {

View file

@ -1,10 +1,8 @@
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/panic-assoc-never-type.rs:11:21 --> $DIR/panic-assoc-never-type.rs:11:21
| |
LL | const VOID: ! = panic!(); LL | const VOID: ! = panic!();
| ----------------^^^^^^^^- | ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/panic-assoc-never-type.rs:11:21
| |
| the evaluated program panicked at 'explicit panic', $DIR/panic-assoc-never-type.rs:11:21
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -4,7 +4,7 @@
#![feature(never_type)] #![feature(never_type)]
const VOID: ! = panic!(); const VOID: ! = panic!();
//~^ ERROR any use of this value will cause an error //~^ ERROR evaluation of constant value failed
fn main() { fn main() {
let _ = VOID; let _ = VOID;

View file

@ -1,10 +1,8 @@
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/panic-never-type.rs:6:17 --> $DIR/panic-never-type.rs:6:17
| |
LL | const VOID: ! = panic!(); LL | const VOID: ! = panic!();
| ----------------^^^^^^^^- | ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/panic-never-type.rs:6:17
| |
| the evaluated program panicked at 'explicit panic', $DIR/panic-never-type.rs:6:17
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -2,7 +2,7 @@
#[unwind(aborts)] #[unwind(aborts)]
const fn foo() { const fn foo() {
panic!() //~ ERROR any use of this value will cause an error panic!() //~ ERROR evaluation of constant value failed
} }
const _: () = foo(); const _: () = foo();

View file

@ -1,4 +1,4 @@
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/unwind-abort.rs:5:5 --> $DIR/unwind-abort.rs:5:5
| |
LL | panic!() LL | panic!()
@ -6,10 +6,9 @@ LL | panic!()
| | | |
| the evaluated program panicked at 'explicit panic', $DIR/unwind-abort.rs:5:5 | the evaluated program panicked at 'explicit panic', $DIR/unwind-abort.rs:5:5
| inside `foo` at $SRC_DIR/std/src/panic.rs:LL:COL | inside `foo` at $SRC_DIR/std/src/panic.rs:LL:COL
| inside `_` at $DIR/unwind-abort.rs:8:15
... ...
LL | const _: () = foo(); LL | const _: () = foo();
| -------------------- | ----- inside `_` at $DIR/unwind-abort.rs:8:15
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -1,4 +1,4 @@
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $SRC_DIR/core/src/option.rs:LL:COL --> $SRC_DIR/core/src/option.rs:LL:COL
| |
LL | None => panic!("called `Option::unwrap()` on a `None` value"), LL | None => panic!("called `Option::unwrap()` on a `None` value"),
@ -6,12 +6,11 @@ LL | None => panic!("called `Option::unwrap()` on a `None` value"),
| | | |
| the evaluated program panicked at 'called `Option::unwrap()` on a `None` value', $DIR/const-unwrap.rs:9:38 | the evaluated program panicked at 'called `Option::unwrap()` on a `None` value', $DIR/const-unwrap.rs:9:38
| inside `Option::<i32>::unwrap` at $SRC_DIR/core/src/panic.rs:LL:COL | inside `Option::<i32>::unwrap` at $SRC_DIR/core/src/panic.rs:LL:COL
| inside `BAR` at $DIR/const-unwrap.rs:9:18
| |
::: $DIR/const-unwrap.rs:9:1 ::: $DIR/const-unwrap.rs:9:18
| |
LL | const BAR: i32 = Option::<i32>::None.unwrap(); LL | const BAR: i32 = Option::<i32>::None.unwrap();
| ---------------------------------------------- | ---------------------------- inside `BAR` at $DIR/const-unwrap.rs:9:18
| |
= note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `$crate::panic::panic_2015` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -1,10 +1,8 @@
error[E0080]: any use of this value will cause an error error[E0080]: evaluation of constant value failed
--> $DIR/assert.rs:10:15 --> $DIR/assert.rs:10:15
| |
LL | const _: () = assert!(false); LL | const _: () = assert!(false);
| --------------^^^^^^^^^^^^^^- | ^^^^^^^^^^^^^^ the evaluated program panicked at 'assertion failed: false', $DIR/assert.rs:10:15
| |
| the evaluated program panicked at 'assertion failed: false', $DIR/assert.rs:10:15
| |
= note: this error originates in the macro `assert` (in Nightly builds, run with -Z macro-backtrace for more info) = note: this error originates in the macro `assert` (in Nightly builds, run with -Z macro-backtrace for more info)

View file

@ -9,6 +9,6 @@ const _: () = assert!(true);
const _: () = assert!(false); const _: () = assert!(false);
//[stock]~^ ERROR panicking in constants is unstable //[stock]~^ ERROR panicking in constants is unstable
//[const_panic]~^^ ERROR any use of this value will cause an error //[const_panic]~^^ ERROR evaluation of constant value failed
fn main() {} fn main() {}