From 9cb47de81337482b226cde3a2f59594ed78412d1 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Sun, 3 Jun 2018 02:04:20 +0200 Subject: [PATCH] Referring to erroneous constants in promoteds must abort the build --- src/librustc_mir/monomorphize/collector.rs | 16 ++++- .../conditional_array_execution.nll.stderr | 45 ++++++++++++ .../const-eval/conditional_array_execution.rs | 2 +- .../conditional_array_execution.stderr | 17 +++-- src/test/ui/const-eval/issue-43197.nll.stderr | 71 +++++++++++++++++++ src/test/ui/const-eval/issue-43197.rs | 3 +- src/test/ui/const-eval/issue-43197.stderr | 29 ++++++-- src/test/ui/const-eval/issue-44578.nll.stderr | 19 +++++ src/test/ui/const-eval/issue-44578.rs | 7 +- src/test/ui/const-eval/issue-44578.stderr | 21 ++---- src/test/ui/const-eval/issue-50814-2.rs | 42 +++++++++++ src/test/ui/const-eval/issue-50814-2.stderr | 11 +++ src/test/ui/const-eval/issue-50814.rs | 32 +++++++++ src/test/ui/const-eval/issue-50814.stderr | 11 +++ 14 files changed, 292 insertions(+), 34 deletions(-) create mode 100644 src/test/ui/const-eval/conditional_array_execution.nll.stderr create mode 100644 src/test/ui/const-eval/issue-43197.nll.stderr create mode 100644 src/test/ui/const-eval/issue-44578.nll.stderr create mode 100644 src/test/ui/const-eval/issue-50814-2.rs create mode 100644 src/test/ui/const-eval/issue-50814-2.stderr create mode 100644 src/test/ui/const-eval/issue-50814.rs create mode 100644 src/test/ui/const-eval/issue-50814.stderr diff --git a/src/librustc_mir/monomorphize/collector.rs b/src/librustc_mir/monomorphize/collector.rs index 54221239253..4f3adaaae27 100644 --- a/src/librustc_mir/monomorphize/collector.rs +++ b/src/librustc_mir/monomorphize/collector.rs @@ -1190,13 +1190,25 @@ fn collect_neighbours<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, let param_env = ty::ParamEnv::reveal_all(); for i in 0..mir.promoted.len() { use rustc_data_structures::indexed_vec::Idx; + let i = Promoted::new(i); let cid = GlobalId { instance, - promoted: Some(Promoted::new(i)), + promoted: Some(i), }; match tcx.const_eval(param_env.and(cid)) { Ok(val) => collect_const(tcx, val, instance.substs, output), - Err(_) => {}, + Err(err) => { + use rustc::middle::const_val::ErrKind; + use rustc::mir::interpret::EvalErrorKind; + if let ErrKind::Miri(ref miri, ..) = *err.kind { + if let EvalErrorKind::ReferencedConstant = miri.kind { + err.report_as_error( + tcx.at(mir.promoted[i].span), + "erroneous constant used", + ); + } + } + }, } } } diff --git a/src/test/ui/const-eval/conditional_array_execution.nll.stderr b/src/test/ui/const-eval/conditional_array_execution.nll.stderr new file mode 100644 index 00000000000..a35252c4789 --- /dev/null +++ b/src/test/ui/const-eval/conditional_array_execution.nll.stderr @@ -0,0 +1,45 @@ +warning: attempt to subtract with overflow + --> $DIR/conditional_array_execution.rs:15:19 + | +LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; + | ^^^^^ + | +note: lint level defined here + --> $DIR/conditional_array_execution.rs:11:9 + | +LL | #![warn(const_err)] + | ^^^^^^^^^ + +warning: this constant cannot be used + --> $DIR/conditional_array_execution.rs:15:1 + | +LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; + | ^^^^^^^^^^^^^^^^^^-----^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | attempt to subtract with overflow + +warning: this expression will panic at runtime + --> $DIR/conditional_array_execution.rs:20:20 + | +LL | println!("{}", FOO); + | ^^^ referenced constant has errors + +error[E0080]: erroneous constant used + --> $DIR/conditional_array_execution.rs:20:5 + | +LL | println!("{}", FOO); + | ^^^^^^^^^^^^^^^---^^ + | | + | referenced constant has errors + | + = 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]: erroneous constant used + --> $DIR/conditional_array_execution.rs:20:20 + | +LL | println!("{}", FOO); + | ^^^ referenced constant has errors + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/const-eval/conditional_array_execution.rs b/src/test/ui/const-eval/conditional_array_execution.rs index daeeae513d9..055224d2731 100644 --- a/src/test/ui/const-eval/conditional_array_execution.rs +++ b/src/test/ui/const-eval/conditional_array_execution.rs @@ -8,7 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-pass #![warn(const_err)] const X: u32 = 5; @@ -20,4 +19,5 @@ const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; fn main() { println!("{}", FOO); //~^ WARN this expression will panic at runtime + //~| ERROR erroneous constant used } diff --git a/src/test/ui/const-eval/conditional_array_execution.stderr b/src/test/ui/const-eval/conditional_array_execution.stderr index 00b39d08eaf..f396c8f0444 100644 --- a/src/test/ui/const-eval/conditional_array_execution.stderr +++ b/src/test/ui/const-eval/conditional_array_execution.stderr @@ -1,17 +1,17 @@ warning: attempt to subtract with overflow - --> $DIR/conditional_array_execution.rs:16:19 + --> $DIR/conditional_array_execution.rs:15:19 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; | ^^^^^ | note: lint level defined here - --> $DIR/conditional_array_execution.rs:12:9 + --> $DIR/conditional_array_execution.rs:11:9 | LL | #![warn(const_err)] | ^^^^^^^^^ warning: this constant cannot be used - --> $DIR/conditional_array_execution.rs:16:1 + --> $DIR/conditional_array_execution.rs:15:1 | LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; | ^^^^^^^^^^^^^^^^^^-----^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -19,8 +19,17 @@ LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize]; | attempt to subtract with overflow warning: this expression will panic at runtime - --> $DIR/conditional_array_execution.rs:21:20 + --> $DIR/conditional_array_execution.rs:20:20 | LL | println!("{}", FOO); | ^^^ referenced constant has errors +error[E0080]: erroneous constant used + --> $DIR/conditional_array_execution.rs:20:20 + | +LL | println!("{}", FOO); + | ^^^ referenced constant has errors + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/const-eval/issue-43197.nll.stderr b/src/test/ui/const-eval/issue-43197.nll.stderr new file mode 100644 index 00000000000..416967613f0 --- /dev/null +++ b/src/test/ui/const-eval/issue-43197.nll.stderr @@ -0,0 +1,71 @@ +warning: attempt to subtract with overflow + --> $DIR/issue-43197.rs:20:20 + | +LL | const X: u32 = 0-1; + | ^^^ + | +note: lint level defined here + --> $DIR/issue-43197.rs:11:9 + | +LL | #![warn(const_err)] + | ^^^^^^^^^ + +warning: this constant cannot be used + --> $DIR/issue-43197.rs:20:5 + | +LL | const X: u32 = 0-1; + | ^^^^^^^^^^^^^^^---^ + | | + | attempt to subtract with overflow + +warning: attempt to subtract with overflow + --> $DIR/issue-43197.rs:23:24 + | +LL | const Y: u32 = foo(0-1); + | ^^^ + +warning: this constant cannot be used + --> $DIR/issue-43197.rs:23:5 + | +LL | const Y: u32 = foo(0-1); + | ^^^^^^^^^^^^^^^^^^^---^^ + | | + | attempt to subtract with overflow + +warning: this expression will panic at runtime + --> $DIR/issue-43197.rs:26:23 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +warning: this expression will panic at runtime + --> $DIR/issue-43197.rs:26:26 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +error[E0080]: erroneous constant used + --> $DIR/issue-43197.rs:26:5 + | +LL | println!("{} {}", X, Y); + | ^^^^^^^^^^^^^^^^^^-^^^^^ + | | + | referenced constant has errors + | + = 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]: erroneous constant used + --> $DIR/issue-43197.rs:26:26 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +error[E0080]: erroneous constant used + --> $DIR/issue-43197.rs:26:23 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/const-eval/issue-43197.rs b/src/test/ui/const-eval/issue-43197.rs index df352adea63..f8d820db747 100644 --- a/src/test/ui/const-eval/issue-43197.rs +++ b/src/test/ui/const-eval/issue-43197.rs @@ -8,7 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-pass #![warn(const_err)] #![feature(const_fn)] @@ -27,4 +26,6 @@ fn main() { println!("{} {}", X, Y); //~^ WARN this expression will panic at runtime //~| WARN this expression will panic at runtime + //~| ERROR erroneous constant used + //~| ERROR erroneous constant used } diff --git a/src/test/ui/const-eval/issue-43197.stderr b/src/test/ui/const-eval/issue-43197.stderr index 412d97883f1..207523f688f 100644 --- a/src/test/ui/const-eval/issue-43197.stderr +++ b/src/test/ui/const-eval/issue-43197.stderr @@ -1,17 +1,17 @@ warning: attempt to subtract with overflow - --> $DIR/issue-43197.rs:21:20 + --> $DIR/issue-43197.rs:20:20 | LL | const X: u32 = 0-1; | ^^^ | note: lint level defined here - --> $DIR/issue-43197.rs:12:9 + --> $DIR/issue-43197.rs:11:9 | LL | #![warn(const_err)] | ^^^^^^^^^ warning: this constant cannot be used - --> $DIR/issue-43197.rs:21:5 + --> $DIR/issue-43197.rs:20:5 | LL | const X: u32 = 0-1; | ^^^^^^^^^^^^^^^---^ @@ -19,13 +19,13 @@ LL | const X: u32 = 0-1; | attempt to subtract with overflow warning: attempt to subtract with overflow - --> $DIR/issue-43197.rs:24:24 + --> $DIR/issue-43197.rs:23:24 | LL | const Y: u32 = foo(0-1); | ^^^ warning: this constant cannot be used - --> $DIR/issue-43197.rs:24:5 + --> $DIR/issue-43197.rs:23:5 | LL | const Y: u32 = foo(0-1); | ^^^^^^^^^^^^^^^^^^^---^^ @@ -33,14 +33,29 @@ LL | const Y: u32 = foo(0-1); | attempt to subtract with overflow warning: this expression will panic at runtime - --> $DIR/issue-43197.rs:27:23 + --> $DIR/issue-43197.rs:26:23 | LL | println!("{} {}", X, Y); | ^ referenced constant has errors warning: this expression will panic at runtime - --> $DIR/issue-43197.rs:27:26 + --> $DIR/issue-43197.rs:26:26 | LL | println!("{} {}", X, Y); | ^ referenced constant has errors +error[E0080]: erroneous constant used + --> $DIR/issue-43197.rs:26:26 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +error[E0080]: erroneous constant used + --> $DIR/issue-43197.rs:26:23 + | +LL | println!("{} {}", X, Y); + | ^ referenced constant has errors + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/const-eval/issue-44578.nll.stderr b/src/test/ui/const-eval/issue-44578.nll.stderr new file mode 100644 index 00000000000..49587fa0809 --- /dev/null +++ b/src/test/ui/const-eval/issue-44578.nll.stderr @@ -0,0 +1,19 @@ +error[E0080]: erroneous constant used + --> $DIR/issue-44578.rs:35:5 + | +LL | println!("{}", as Foo>::AMT); + | ^^^^^^^^^^^^^^^--------------------------^^ + | | + | referenced constant has errors + | + = 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]: erroneous constant used + --> $DIR/issue-44578.rs:35:20 + | +LL | println!("{}", as Foo>::AMT); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/const-eval/issue-44578.rs b/src/test/ui/const-eval/issue-44578.rs index 4133a8864f6..331de4ab661 100644 --- a/src/test/ui/const-eval/issue-44578.rs +++ b/src/test/ui/const-eval/issue-44578.rs @@ -8,8 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-pass -#![warn(const_err)] +#![allow(const_err)] trait Foo { const AMT: usize; @@ -33,6 +32,6 @@ impl Foo for u16 { } fn main() { - println!("{}", as Foo>::AMT); //~ WARN const_err - //~^ WARN const_err + println!("{}", as Foo>::AMT); + //~^ ERROR erroneous constant used } diff --git a/src/test/ui/const-eval/issue-44578.stderr b/src/test/ui/const-eval/issue-44578.stderr index 3632a9baea1..42d60c604b8 100644 --- a/src/test/ui/const-eval/issue-44578.stderr +++ b/src/test/ui/const-eval/issue-44578.stderr @@ -1,18 +1,9 @@ -warning: this expression will panic at runtime - --> $DIR/issue-44578.rs:36:20 +error[E0080]: erroneous constant used + --> $DIR/issue-44578.rs:35:20 | -LL | println!("{}", as Foo>::AMT); //~ WARN const_err - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors - | -note: lint level defined here - --> $DIR/issue-44578.rs:12:9 - | -LL | #![warn(const_err)] - | ^^^^^^^^^ - -warning: this expression will panic at runtime - --> $DIR/issue-44578.rs:36:20 - | -LL | println!("{}", as Foo>::AMT); //~ WARN const_err +LL | println!("{}", as Foo>::AMT); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/const-eval/issue-50814-2.rs b/src/test/ui/const-eval/issue-50814-2.rs new file mode 100644 index 00000000000..a90579296cb --- /dev/null +++ b/src/test/ui/const-eval/issue-50814-2.rs @@ -0,0 +1,42 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +trait C { + const BOO: usize; +} + +trait Foo { + const BAR: usize; +} + +struct A(T); + +impl Foo for A { + const BAR: usize = [5, 6, 7][T::BOO]; +} + +fn foo() -> &'static usize { + & as Foo>::BAR //~ ERROR erroneous constant used +} + +impl C for () { + const BOO: usize = 42; +} + +impl C for u32 { + const BOO: usize = 1; +} + +fn main() { + println!("{:x}", foo::<()>() as *const usize as usize); + println!("{:x}", foo::() as *const usize as usize); + println!("{:x}", foo::<()>()); + println!("{:x}", foo::()); +} \ No newline at end of file diff --git a/src/test/ui/const-eval/issue-50814-2.stderr b/src/test/ui/const-eval/issue-50814-2.stderr new file mode 100644 index 00000000000..3c613130354 --- /dev/null +++ b/src/test/ui/const-eval/issue-50814-2.stderr @@ -0,0 +1,11 @@ +error[E0080]: erroneous constant used + --> $DIR/issue-50814-2.rs:26:5 + | +LL | & as Foo>::BAR //~ ERROR erroneous constant used + | ^--------------------- + | | + | referenced constant has errors + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/const-eval/issue-50814.rs b/src/test/ui/const-eval/issue-50814.rs new file mode 100644 index 00000000000..2af51c48bd4 --- /dev/null +++ b/src/test/ui/const-eval/issue-50814.rs @@ -0,0 +1,32 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +trait Unsigned { + const MAX: u8; +} + +struct U8(u8); +impl Unsigned for U8 { + const MAX: u8 = 0xff; +} + +struct Sum(A,B); + +impl Unsigned for Sum { + const MAX: u8 = A::MAX + B::MAX; +} + +fn foo(_: T) -> &'static u8 { + &Sum::::MAX //~ ERROR erroneous constant used +} + +fn main() { + foo(0); +} \ No newline at end of file diff --git a/src/test/ui/const-eval/issue-50814.stderr b/src/test/ui/const-eval/issue-50814.stderr new file mode 100644 index 00000000000..b3e13b43894 --- /dev/null +++ b/src/test/ui/const-eval/issue-50814.stderr @@ -0,0 +1,11 @@ +error[E0080]: erroneous constant used + --> $DIR/issue-50814.rs:27:5 + | +LL | &Sum::::MAX //~ ERROR erroneous constant used + | ^----------------- + | | + | referenced constant has errors + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`.