const-eval: organize and extend tests for required-consts
This commit is contained in:
parent
7de1a1f6db
commit
514b2745b3
@ -1,15 +0,0 @@
|
|||||||
error[E0080]: evaluation of `PrintName::<i32>::VOID` failed
|
|
||||||
--> $DIR/erroneous-const.rs:6:22
|
|
||||||
|
|
|
||||||
LL | const VOID: () = [()][2];
|
|
||||||
| ^^^^^^^ index out of bounds: the length is 1 but the index is 2
|
|
||||||
|
|
||||||
note: erroneous constant encountered
|
|
||||||
--> $DIR/erroneous-const.rs:13:13
|
|
||||||
|
|
|
||||||
LL | PrintName::<T>::VOID;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0080`.
|
|
@ -1,19 +0,0 @@
|
|||||||
//! Make sure we error on erroneous consts even if they are unused.
|
|
||||||
#![allow(unconditional_panic)]
|
|
||||||
|
|
||||||
struct PrintName<T>(T);
|
|
||||||
impl<T> PrintName<T> {
|
|
||||||
const VOID: () = [()][2]; //~ERROR evaluation of `PrintName::<i32>::VOID` failed
|
|
||||||
}
|
|
||||||
|
|
||||||
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.
|
|
||||||
PrintName::<i32>::VOID; //~ constant
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
fn main() {
|
|
||||||
FOO
|
|
||||||
}
|
|
@ -1,15 +0,0 @@
|
|||||||
error[E0080]: evaluation of `PrintName::<i32>::VOID` failed
|
|
||||||
--> $DIR/erroneous-const2.rs:6:22
|
|
||||||
|
|
|
||||||
LL | const VOID: () = [()][2];
|
|
||||||
| ^^^^^^^ index out of bounds: the length is 1 but the index is 2
|
|
||||||
|
|
||||||
note: erroneous constant encountered
|
|
||||||
--> $DIR/erroneous-const2.rs:13:9
|
|
||||||
|
|
|
||||||
LL | PrintName::<i32>::VOID;
|
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0080`.
|
|
@ -1,11 +0,0 @@
|
|||||||
error[E0080]: evaluation of `PrintName::<i32>::VOID` failed
|
|
||||||
--> $DIR/unused-broken-const-late.rs:8:22
|
|
||||||
|
|
|
||||||
LL | const VOID: () = panic!();
|
|
||||||
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/unused-broken-const-late.rs:8:22
|
|
||||||
|
|
|
||||||
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
|
||||||
|
|
||||||
error: aborting due to 1 previous error
|
|
||||||
|
|
||||||
For more information about this error, try `rustc --explain E0080`.
|
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/collect-in-called-fn.rs:9:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/collect-in-called-fn.rs:9:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: the above error was encountered while instantiating `fn called::<i32>`
|
||||||
|
--> $DIR/collect-in-called-fn.rs:23:5
|
||||||
|
|
|
||||||
|
LL | called::<i32>();
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/collect-in-called-fn.rs:9:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/collect-in-called-fn.rs:9:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: the above error was encountered while instantiating `fn called::<i32>`
|
||||||
|
--> $DIR/collect-in-called-fn.rs:23:5
|
||||||
|
|
|
||||||
|
LL | called::<i32>();
|
||||||
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
@ -1,20 +1,24 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
//@ build-fail
|
//@ build-fail
|
||||||
//@ compile-flags: -O
|
//@[opt] compile-flags: -O
|
||||||
//! Make sure we detect erroneous constants post-monomorphization even when they are unused. This is
|
//! Make sure we detect erroneous constants post-monomorphization even when they are unused. This is
|
||||||
//! crucial, people rely on it for soundness. (https://github.com/rust-lang/rust/issues/112090)
|
//! crucial, people rely on it for soundness. (https://github.com/rust-lang/rust/issues/112090)
|
||||||
|
|
||||||
struct PrintName<T>(T);
|
struct Fail<T>(T);
|
||||||
impl<T> PrintName<T> {
|
impl<T> Fail<T> {
|
||||||
const VOID: () = panic!(); //~ERROR evaluation of `PrintName::<i32>::VOID` failed
|
const C: () = panic!(); //~ERROR evaluation of `Fail::<i32>::C` failed
|
||||||
}
|
}
|
||||||
|
|
||||||
fn no_codegen<T>() {
|
#[inline(never)]
|
||||||
|
fn called<T>() {
|
||||||
// Any function that is called is guaranteed to have all consts that syntactically
|
// Any function that is called is guaranteed to have all consts that syntactically
|
||||||
// appear in its body evaluated, even if they only appear in dead code.
|
// appear in its body evaluated, even if they only appear in dead code.
|
||||||
|
// This relies on mono-item collection checking `required_consts` in collected functions.
|
||||||
if false {
|
if false {
|
||||||
let _ = PrintName::<T>::VOID;
|
let _ = Fail::<T>::C;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
no_codegen::<i32>();
|
called::<i32>();
|
||||||
}
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/collect-in-dead-drop.rs:12:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/collect-in-dead-drop.rs:12:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: the above error was encountered while instantiating `fn <Fail<i32> as std::ops::Drop>::drop`
|
||||||
|
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
33
tests/ui/consts/required-consts/collect-in-dead-drop.rs
Normal file
33
tests/ui/consts/required-consts/collect-in-dead-drop.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@[noopt] build-fail
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
|
//FIXME: `opt` revision currently does not stop with an error due to
|
||||||
|
//<https://github.com/rust-lang/rust/issues/107503>.
|
||||||
|
//@[opt] build-pass
|
||||||
|
//! Make sure we detect erroneous constants post-monomorphization even when they are unused. This is
|
||||||
|
//! crucial, people rely on it for soundness. (https://github.com/rust-lang/rust/issues/112090)
|
||||||
|
|
||||||
|
struct Fail<T>(T);
|
||||||
|
impl<T> Fail<T> {
|
||||||
|
const C: () = panic!(); //[noopt]~ERROR evaluation of `Fail::<i32>::C` failed
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is not actually called, but is mentioned implicitly as destructor in dead code in a
|
||||||
|
// function that is called. Make sure we still find this error.
|
||||||
|
impl<T> Drop for Fail<T> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
let _ = Fail::<T>::C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
fn called<T>(x: T) {
|
||||||
|
if false {
|
||||||
|
let v = Fail(x);
|
||||||
|
// Now it gest dropped implicitly, at the end of this scope.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
called::<i32>(0);
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/collect-in-dead-fn.rs:12:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/collect-in-dead-fn.rs:12:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: the above error was encountered while instantiating `fn not_called::<i32>`
|
||||||
|
--> $DIR/collect-in-dead-fn.rs:29:9
|
||||||
|
|
|
||||||
|
LL | not_called::<T>();
|
||||||
|
| ^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
35
tests/ui/consts/required-consts/collect-in-dead-fn.rs
Normal file
35
tests/ui/consts/required-consts/collect-in-dead-fn.rs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@[noopt] build-fail
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
|
//FIXME: `opt` revision currently does not stop with an error due to
|
||||||
|
//<https://github.com/rust-lang/rust/issues/107503>.
|
||||||
|
//@[opt] build-pass
|
||||||
|
//! Make sure we detect erroneous constants post-monomorphization even when they are unused. This is
|
||||||
|
//! crucial, people rely on it for soundness. (https://github.com/rust-lang/rust/issues/112090)
|
||||||
|
|
||||||
|
struct Fail<T>(T);
|
||||||
|
impl<T> Fail<T> {
|
||||||
|
const C: () = panic!(); //[noopt]~ERROR evaluation of `Fail::<i32>::C` failed
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is not actually called, but it is mentioned in dead code in a function that is
|
||||||
|
// called. Make sure we still find this error.
|
||||||
|
// This relies on mono-item collection checking `required_consts` in functions that syntactically
|
||||||
|
// are called in collected functions (even inside dead code).
|
||||||
|
#[inline(never)]
|
||||||
|
fn not_called<T>() {
|
||||||
|
if false {
|
||||||
|
let _ = Fail::<T>::C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
fn called<T>() {
|
||||||
|
if false {
|
||||||
|
not_called::<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
called::<i32>();
|
||||||
|
}
|
32
tests/ui/consts/required-consts/collect-in-dead-forget.rs
Normal file
32
tests/ui/consts/required-consts/collect-in-dead-forget.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@build-pass
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
|
//! Make sure we detect erroneous constants post-monomorphization even when they are unused. This is
|
||||||
|
//! crucial, people rely on it for soundness. (https://github.com/rust-lang/rust/issues/112090)
|
||||||
|
|
||||||
|
struct Fail<T>(T);
|
||||||
|
impl<T> Fail<T> {
|
||||||
|
const C: () = panic!();
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is not actually called, but is mentioned implicitly as destructor in dead code in a
|
||||||
|
// function that is called. Make sure we still find this error.
|
||||||
|
impl<T> Drop for Fail<T> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
let _ = Fail::<T>::C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
fn called<T>(x: T) {
|
||||||
|
if false {
|
||||||
|
let v = Fail(x);
|
||||||
|
std::mem::forget(v);
|
||||||
|
// Now the destructor never gets "mentioned" so this build should *not* fail.
|
||||||
|
// IOW, this demonstrates that we are using a post-drop-elab notion of "mentioned".
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
called::<i32>(0);
|
||||||
|
}
|
@ -0,0 +1,14 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/collect-in-dead-move.rs:12:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/collect-in-dead-move.rs:12:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: the above error was encountered while instantiating `fn <Fail<i32> as std::ops::Drop>::drop`
|
||||||
|
--> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
33
tests/ui/consts/required-consts/collect-in-dead-move.rs
Normal file
33
tests/ui/consts/required-consts/collect-in-dead-move.rs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@[noopt] build-fail
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
|
//FIXME: `opt` revision currently does not stop with an error due to
|
||||||
|
//<https://github.com/rust-lang/rust/issues/107503>.
|
||||||
|
//@[opt] build-pass
|
||||||
|
//! Make sure we detect erroneous constants post-monomorphization even when they are unused. This is
|
||||||
|
//! crucial, people rely on it for soundness. (https://github.com/rust-lang/rust/issues/112090)
|
||||||
|
|
||||||
|
struct Fail<T>(T);
|
||||||
|
impl<T> Fail<T> {
|
||||||
|
const C: () = panic!(); //[noopt]~ERROR evaluation of `Fail::<i32>::C` failed
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is not actually called, but is mentioned implicitly as destructor in dead code in a
|
||||||
|
// function that is called. Make sure we still find this error.
|
||||||
|
impl<T> Drop for Fail<T> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
let _ = Fail::<T>::C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
fn called<T>(x: T) {
|
||||||
|
if false {
|
||||||
|
let v = Fail(x);
|
||||||
|
drop(v); // move `v` away (and it then gets dropped there so build still fails)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
called::<i32>(0);
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/collect-in-dead-vtable.rs:12:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/collect-in-dead-vtable.rs:12:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: the above error was encountered while instantiating `fn <std::vec::Vec<i32> as MyTrait>::not_called`
|
||||||
|
--> $DIR/collect-in-dead-vtable.rs:35:40
|
||||||
|
|
|
||||||
|
LL | let gen_vtable: &dyn MyTrait = &v; // vtable "appears" here
|
||||||
|
| ^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
41
tests/ui/consts/required-consts/collect-in-dead-vtable.rs
Normal file
41
tests/ui/consts/required-consts/collect-in-dead-vtable.rs
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@[noopt] build-fail
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
|
//FIXME: `opt` revision currently does not stop with an error due to
|
||||||
|
//<https://github.com/rust-lang/rust/issues/107503>.
|
||||||
|
//@[opt] build-pass
|
||||||
|
//! Make sure we detect erroneous constants post-monomorphization even when they are unused. This is
|
||||||
|
//! crucial, people rely on it for soundness. (https://github.com/rust-lang/rust/issues/112090)
|
||||||
|
|
||||||
|
struct Fail<T>(T);
|
||||||
|
impl<T> Fail<T> {
|
||||||
|
const C: () = panic!(); //[noopt]~ERROR evaluation of `Fail::<i32>::C` failed
|
||||||
|
}
|
||||||
|
|
||||||
|
trait MyTrait {
|
||||||
|
fn not_called(&self);
|
||||||
|
}
|
||||||
|
|
||||||
|
// This function is not actually called, but it is mentioned in a vtable in a function that is
|
||||||
|
// called. Make sure we still find this error.
|
||||||
|
// This relies on mono-item collection checking `required_consts` in functions that are referenced
|
||||||
|
// in vtables that syntactically appear in collected functions (even inside dead code).
|
||||||
|
impl<T> MyTrait for Vec<T> {
|
||||||
|
fn not_called(&self) {
|
||||||
|
if false {
|
||||||
|
let _ = Fail::<T>::C;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
fn called<T>() {
|
||||||
|
if false {
|
||||||
|
let v: Vec<T> = Vec::new();
|
||||||
|
let gen_vtable: &dyn MyTrait = &v; // vtable "appears" here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() {
|
||||||
|
called::<i32>();
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/interpret-in-const-called-fn.rs:7:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/interpret-in-const-called-fn.rs:7:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: erroneous constant encountered
|
||||||
|
--> $DIR/interpret-in-const-called-fn.rs:16:9
|
||||||
|
|
|
||||||
|
LL | Fail::<T>::C;
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/interpret-in-const-called-fn.rs:7:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/interpret-in-const-called-fn.rs:7:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: erroneous constant encountered
|
||||||
|
--> $DIR/interpret-in-const-called-fn.rs:16:9
|
||||||
|
|
|
||||||
|
LL | Fail::<T>::C;
|
||||||
|
| ^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
@ -1,16 +1,19 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
//! Make sure we error on erroneous consts even if they are unused.
|
//! Make sure we error on erroneous consts even if they are unused.
|
||||||
#![allow(unconditional_panic)]
|
|
||||||
|
|
||||||
struct PrintName<T>(T);
|
struct Fail<T>(T);
|
||||||
impl<T> PrintName<T> {
|
impl<T> Fail<T> {
|
||||||
const VOID: () = [()][2]; //~ERROR evaluation of `PrintName::<i32>::VOID` failed
|
const C: () = panic!(); //~ERROR evaluation of `Fail::<i32>::C` failed
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
const fn no_codegen<T>() {
|
const fn no_codegen<T>() {
|
||||||
if false {
|
if false {
|
||||||
// This bad constant is only used in dead code in a no-codegen function... and yet we still
|
// 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.
|
// must make sure that the build fails.
|
||||||
PrintName::<T>::VOID; //~ constant
|
// This relies on const-eval evaluating all `required_consts` of `const fn`.
|
||||||
|
Fail::<T>::C; //~ constant
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,27 @@
|
|||||||
|
error[E0080]: evaluation of constant value failed
|
||||||
|
--> $SRC_DIR/core/src/hint.rs:LL:COL
|
||||||
|
|
|
||||||
|
= note: entering unreachable code
|
||||||
|
|
|
||||||
|
note: inside `unreachable_unchecked`
|
||||||
|
--> $SRC_DIR/core/src/hint.rs:LL:COL
|
||||||
|
note: inside `ub`
|
||||||
|
--> $DIR/interpret-in-promoted.rs:6:5
|
||||||
|
|
|
||||||
|
LL | std::hint::unreachable_unchecked();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: inside `FOO`
|
||||||
|
--> $DIR/interpret-in-promoted.rs:12:28
|
||||||
|
|
|
||||||
|
LL | let _x: &'static () = &ub();
|
||||||
|
| ^^^^
|
||||||
|
|
||||||
|
note: erroneous constant encountered
|
||||||
|
--> $DIR/interpret-in-promoted.rs:12:27
|
||||||
|
|
|
||||||
|
LL | let _x: &'static () = &ub();
|
||||||
|
| ^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
@ -0,0 +1,27 @@
|
|||||||
|
error[E0080]: evaluation of constant value failed
|
||||||
|
--> $SRC_DIR/core/src/hint.rs:LL:COL
|
||||||
|
|
|
||||||
|
= note: entering unreachable code
|
||||||
|
|
|
||||||
|
note: inside `unreachable_unchecked`
|
||||||
|
--> $SRC_DIR/core/src/hint.rs:LL:COL
|
||||||
|
note: inside `ub`
|
||||||
|
--> $DIR/interpret-in-promoted.rs:6:5
|
||||||
|
|
|
||||||
|
LL | std::hint::unreachable_unchecked();
|
||||||
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
note: inside `FOO`
|
||||||
|
--> $DIR/interpret-in-promoted.rs:12:28
|
||||||
|
|
|
||||||
|
LL | let _x: &'static () = &ub();
|
||||||
|
| ^^^^
|
||||||
|
|
||||||
|
note: erroneous constant encountered
|
||||||
|
--> $DIR/interpret-in-promoted.rs:12:27
|
||||||
|
|
|
||||||
|
LL | let _x: &'static () = &ub();
|
||||||
|
| ^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
15
tests/ui/consts/required-consts/interpret-in-promoted.rs
Normal file
15
tests/ui/consts/required-consts/interpret-in-promoted.rs
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
|
//! Make sure we error on erroneous consts even if they are unused.
|
||||||
|
|
||||||
|
const unsafe fn ub() {
|
||||||
|
std::hint::unreachable_unchecked();
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const FOO: () = unsafe {
|
||||||
|
// Make sure that this gets promoted and then fails to evaluate, and we deal with that
|
||||||
|
// correctly.
|
||||||
|
let _x: &'static () = &ub(); //~ erroneous constant
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {}
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/interpret-in-static.rs:7:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/interpret-in-static.rs:7:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: erroneous constant encountered
|
||||||
|
--> $DIR/interpret-in-static.rs:15:9
|
||||||
|
|
|
||||||
|
LL | Fail::<i32>::C;
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
@ -0,0 +1,17 @@
|
|||||||
|
error[E0080]: evaluation of `Fail::<i32>::C` failed
|
||||||
|
--> $DIR/interpret-in-static.rs:7:19
|
||||||
|
|
|
||||||
|
LL | const C: () = panic!();
|
||||||
|
| ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/interpret-in-static.rs:7:19
|
||||||
|
|
|
||||||
|
= note: this error originates in the macro `$crate::panic::panic_2015` which comes from the expansion of the macro `panic` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||||
|
|
||||||
|
note: erroneous constant encountered
|
||||||
|
--> $DIR/interpret-in-static.rs:15:9
|
||||||
|
|
|
||||||
|
LL | Fail::<i32>::C;
|
||||||
|
| ^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0080`.
|
21
tests/ui/consts/required-consts/interpret-in-static.rs
Normal file
21
tests/ui/consts/required-consts/interpret-in-static.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//@revisions: noopt opt
|
||||||
|
//@[opt] compile-flags: -O
|
||||||
|
//! Make sure we error on erroneous consts even if they are unused.
|
||||||
|
|
||||||
|
struct Fail<T>(T);
|
||||||
|
impl<T> Fail<T> {
|
||||||
|
const C: () = panic!(); //~ERROR evaluation of `Fail::<i32>::C` failed
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
// This relies on const-eval evaluating all `required_consts` of the `static` MIR body.
|
||||||
|
Fail::<i32>::C; //~ constant
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
FOO
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user