Turn the use of erroneous constants into errors again

This commit is contained in:
Oliver Schneider 2018-06-27 14:55:06 +02:00
parent 4eea1a4e5e
commit 4d473300a2
13 changed files with 45 additions and 42 deletions

View file

@ -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();
},
_ => {},
}

View file

@ -170,10 +170,23 @@ impl<'b, 'a, 'tcx:'b> ConstPropagator<'b, 'a, 'tcx> {
) -> Option<Const<'tcx>> {
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 } => {

View file

@ -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
}

View file

@ -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];

View file

@ -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];

View file

@ -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;

View file

@ -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;

View file

@ -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!("{}", <Bar<u16, u8> 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];

View file

@ -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];

View file

@ -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];

View file

@ -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;

View file

@ -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
}

View file

@ -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`.