From 4d473300a200b26b04335dcd32200878ce8e6e04 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Wed, 27 Jun 2018 14:55:06 +0200 Subject: [PATCH] Turn the use of erroneous constants into errors again --- src/librustc/mir/interpret/error.rs | 2 +- src/librustc_mir/transform/const_prop.rs | 21 +++++++++++++++---- src/test/compile-fail/const-err.rs | 2 ++ .../conditional_array_execution.nll.stderr | 6 +++--- .../conditional_array_execution.stderr | 4 ++-- src/test/ui/const-eval/issue-43197.nll.stderr | 10 ++++----- src/test/ui/const-eval/issue-43197.stderr | 8 +++---- src/test/ui/const-eval/issue-44578.nll.stderr | 4 ++-- src/test/ui/const-eval/issue-44578.stderr | 2 +- src/test/ui/const-eval/issue-50814-2.stderr | 2 +- src/test/ui/const-eval/issue-50814.stderr | 2 +- .../ui/const-len-underflow-separate-spans.rs | 5 ++--- .../const-len-underflow-separate-spans.stderr | 19 ++++------------- 13 files changed, 45 insertions(+), 42 deletions(-) diff --git a/src/librustc/mir/interpret/error.rs b/src/librustc/mir/interpret/error.rs index 3291d6bf1521..86427bb2382c 100644 --- a/src/librustc/mir/interpret/error.rs +++ b/src/librustc/mir/interpret/error.rs @@ -80,7 +80,7 @@ impl<'a, 'gcx, 'tcx> ConstEvalErr<'tcx> { ::mir::interpret::EvalErrorKind::CheckMatchError | ::mir::interpret::EvalErrorKind::Layout(_) => return None, ::mir::interpret::EvalErrorKind::ReferencedConstant(ref inner) => { - inner.struct_generic(tcx, "referenced constant", lint_root)?.emit(); + inner.struct_generic(tcx, "referenced constant has errors", lint_root)?.emit(); }, _ => {}, } diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index 95bac24a77bd..3b3c28f6ae26 100644 --- a/src/librustc_mir/transform/const_prop.rs +++ b/src/librustc_mir/transform/const_prop.rs @@ -170,10 +170,23 @@ impl<'b, 'a, 'tcx:'b> ConstPropagator<'b, 'a, 'tcx> { ) -> Option> { match c.literal { Literal::Value { value } => { - let v = self.use_ecx(source_info, |this| { - this.ecx.const_to_value(value.val) - })?; - Some((v, value.ty, c.span)) + self.ecx.tcx.span = source_info.span; + match self.ecx.const_to_value(value.val) { + Ok(val) => Some((val, value.ty, c.span)), + Err(error) => { + let (stacktrace, span) = self.ecx.generate_stacktrace(None); + let err = ConstEvalErr { + span, + error, + stacktrace, + }; + err.report_as_error( + self.tcx.at(source_info.span), + "could not evaluate constant", + ); + None + }, + } }, // evaluate the promoted and replace the constant with the evaluated result Literal::Promoted { index } => { diff --git a/src/test/compile-fail/const-err.rs b/src/test/compile-fail/const-err.rs index f6a64bcba21c..8683f6a02319 100644 --- a/src/test/compile-fail/const-err.rs +++ b/src/test/compile-fail/const-err.rs @@ -27,4 +27,6 @@ const FOO: u8 = [5u8][1]; fn main() { black_box((FOO, FOO)); + //~^ ERROR referenced constant has errors + //~| ERROR could not evaluate constant } diff --git a/src/test/ui/const-eval/conditional_array_execution.nll.stderr b/src/test/ui/const-eval/conditional_array_execution.nll.stderr index 7be9202a2f56..8bc302a2befa 100644 --- a/src/test/ui/const-eval/conditional_array_execution.nll.stderr +++ b/src/test/ui/const-eval/conditional_array_execution.nll.stderr @@ -12,7 +12,7 @@ note: lint level defined here LL | #![warn(const_err)] | ^^^^^^^^^ -warning: referenced constant +warning: referenced constant has errors --> $DIR/conditional_array_execution.rs:19:20 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; @@ -27,7 +27,7 @@ warning: this expression will panic at runtime LL | println!("{}", FOO); | ^^^ referenced constant has errors -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/conditional_array_execution.rs:19:5 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; @@ -48,7 +48,7 @@ LL | println!("{}", FOO); | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/conditional_array_execution.rs:19:20 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; diff --git a/src/test/ui/const-eval/conditional_array_execution.stderr b/src/test/ui/const-eval/conditional_array_execution.stderr index 8a1b75721798..649da03a5e7f 100644 --- a/src/test/ui/const-eval/conditional_array_execution.stderr +++ b/src/test/ui/const-eval/conditional_array_execution.stderr @@ -12,7 +12,7 @@ note: lint level defined here LL | #![warn(const_err)] | ^^^^^^^^^ -warning: referenced constant +warning: referenced constant has errors --> $DIR/conditional_array_execution.rs:19:20 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; @@ -27,7 +27,7 @@ warning: this expression will panic at runtime LL | println!("{}", FOO); | ^^^ referenced constant has errors -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/conditional_array_execution.rs:19:20 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; diff --git a/src/test/ui/const-eval/issue-43197.nll.stderr b/src/test/ui/const-eval/issue-43197.nll.stderr index 6437369214b3..5819e6a9254a 100644 --- a/src/test/ui/const-eval/issue-43197.nll.stderr +++ b/src/test/ui/const-eval/issue-43197.nll.stderr @@ -20,7 +20,7 @@ LL | const Y: u32 = foo(0-1); | | | attempt to subtract with overflow -warning: referenced constant +warning: referenced constant has errors --> $DIR/issue-43197.rs:24:23 | LL | const X: u32 = 0-1; @@ -35,7 +35,7 @@ warning: this expression will panic at runtime LL | println!("{} {}", X, Y); | ^ referenced constant has errors -warning: referenced constant +warning: referenced constant has errors --> $DIR/issue-43197.rs:24:26 | LL | const Y: u32 = foo(0-1); @@ -50,7 +50,7 @@ warning: this expression will panic at runtime LL | println!("{} {}", X, Y); | ^ referenced constant has errors -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-43197.rs:24:5 | LL | const X: u32 = 0-1; @@ -71,7 +71,7 @@ LL | println!("{} {}", X, Y); | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-43197.rs:24:26 | LL | const Y: u32 = foo(0-1); @@ -86,7 +86,7 @@ error[E0080]: erroneous constant used LL | println!("{} {}", X, Y); | ^ referenced constant has errors -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-43197.rs:24:23 | LL | const X: u32 = 0-1; diff --git a/src/test/ui/const-eval/issue-43197.stderr b/src/test/ui/const-eval/issue-43197.stderr index 3cb8b345c673..bf864d81ea3c 100644 --- a/src/test/ui/const-eval/issue-43197.stderr +++ b/src/test/ui/const-eval/issue-43197.stderr @@ -20,7 +20,7 @@ LL | const Y: u32 = foo(0-1); | | | attempt to subtract with overflow -warning: referenced constant +warning: referenced constant has errors --> $DIR/issue-43197.rs:24:23 | LL | const X: u32 = 0-1; @@ -35,7 +35,7 @@ warning: this expression will panic at runtime LL | println!("{} {}", X, Y); | ^ referenced constant has errors -warning: referenced constant +warning: referenced constant has errors --> $DIR/issue-43197.rs:24:26 | LL | const Y: u32 = foo(0-1); @@ -50,7 +50,7 @@ warning: this expression will panic at runtime LL | println!("{} {}", X, Y); | ^ referenced constant has errors -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-43197.rs:24:26 | LL | const Y: u32 = foo(0-1); @@ -65,7 +65,7 @@ error[E0080]: erroneous constant used LL | println!("{} {}", X, Y); | ^ referenced constant has errors -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-43197.rs:24:23 | LL | const X: u32 = 0-1; diff --git a/src/test/ui/const-eval/issue-44578.nll.stderr b/src/test/ui/const-eval/issue-44578.nll.stderr index ad4f08966c01..eeb152e00ea4 100644 --- a/src/test/ui/const-eval/issue-44578.nll.stderr +++ b/src/test/ui/const-eval/issue-44578.nll.stderr @@ -1,4 +1,4 @@ -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-44578.rs:35:5 | LL | const AMT: usize = [A::AMT][(A::AMT > B::AMT) as usize]; @@ -19,7 +19,7 @@ LL | println!("{}", as Foo>::AMT); | = note: this error originates in a macro outside of the current crate (in Nightly builds, run with -Z external-macro-backtrace for more info) -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-44578.rs:35:20 | LL | const AMT: usize = [A::AMT][(A::AMT > B::AMT) as usize]; diff --git a/src/test/ui/const-eval/issue-44578.stderr b/src/test/ui/const-eval/issue-44578.stderr index 28a723a069ed..06174f37dcad 100644 --- a/src/test/ui/const-eval/issue-44578.stderr +++ b/src/test/ui/const-eval/issue-44578.stderr @@ -1,4 +1,4 @@ -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-44578.rs:35:20 | LL | const AMT: usize = [A::AMT][(A::AMT > B::AMT) as usize]; diff --git a/src/test/ui/const-eval/issue-50814-2.stderr b/src/test/ui/const-eval/issue-50814-2.stderr index 3c59cb0e2bc7..1e37e9498120 100644 --- a/src/test/ui/const-eval/issue-50814-2.stderr +++ b/src/test/ui/const-eval/issue-50814-2.stderr @@ -1,4 +1,4 @@ -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-50814-2.rs:26:5 | LL | const BAR: usize = [5, 6, 7][T::BOO]; diff --git a/src/test/ui/const-eval/issue-50814.stderr b/src/test/ui/const-eval/issue-50814.stderr index 145279ccc033..16160207c573 100644 --- a/src/test/ui/const-eval/issue-50814.stderr +++ b/src/test/ui/const-eval/issue-50814.stderr @@ -1,4 +1,4 @@ -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/issue-50814.rs:27:5 | LL | const MAX: u8 = A::MAX + B::MAX; diff --git a/src/test/ui/const-len-underflow-separate-spans.rs b/src/test/ui/const-len-underflow-separate-spans.rs index 242561da9d54..8db1411005e5 100644 --- a/src/test/ui/const-len-underflow-separate-spans.rs +++ b/src/test/ui/const-len-underflow-separate-spans.rs @@ -20,7 +20,6 @@ fn main() { let a: [i8; LEN] = unimplemented!(); //~^ ERROR E0080 //~| ERROR E0080 -//~| ERROR const_err -//~| ERROR const_err -//~| ERROR const_err +//~| ERROR E0080 +//~| ERROR E0080 } diff --git a/src/test/ui/const-len-underflow-separate-spans.stderr b/src/test/ui/const-len-underflow-separate-spans.stderr index a941b0c703fe..cf97a0dc5557 100644 --- a/src/test/ui/const-len-underflow-separate-spans.stderr +++ b/src/test/ui/const-len-underflow-separate-spans.stderr @@ -1,4 +1,4 @@ -error: referenced constant +error[E0080]: referenced constant has errors --> $DIR/const-len-underflow-separate-spans.rs:20:17 | LL | const LEN: usize = ONE - TWO; @@ -6,25 +6,14 @@ LL | const LEN: usize = ONE - TWO; ... LL | let a: [i8; LEN] = unimplemented!(); | ^^^ - | - = note: #[deny(const_err)] on by default -error: this expression will panic at runtime +error[E0080]: could not evaluate constant --> $DIR/const-len-underflow-separate-spans.rs:20:17 | LL | let a: [i8; LEN] = unimplemented!(); | ^^^ referenced constant has errors -error: referenced constant - --> $DIR/const-len-underflow-separate-spans.rs:20:17 - | -LL | const LEN: usize = ONE - TWO; - | --------- attempt to subtract with overflow -... -LL | let a: [i8; LEN] = unimplemented!(); - | ^^^ - -error[E0080]: referenced constant +error[E0080]: referenced constant has errors --> $DIR/const-len-underflow-separate-spans.rs:20:12 | LL | const LEN: usize = ONE - TWO; @@ -41,6 +30,6 @@ LL | let a: [i8; LEN] = unimplemented!(); | | | referenced constant has errors -error: aborting due to 5 previous errors +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0080`.