diff --git a/src/test/ui/consts/miri_unleashed/const_refers_to_static.rs b/src/test/ui/consts/miri_unleashed/const_refers_to_static.rs index 55f3f1c848855..e07db3ffba25e 100644 --- a/src/test/ui/consts/miri_unleashed/const_refers_to_static.rs +++ b/src/test/ui/consts/miri_unleashed/const_refers_to_static.rs @@ -6,31 +6,31 @@ use std::sync::atomic::AtomicUsize; use std::sync::atomic::Ordering; -const BOO: &usize = { //~ ERROR undefined behavior to use this value +const REF_INTERIOR_MUT: &usize = { //~ ERROR undefined behavior to use this value static FOO: AtomicUsize = AtomicUsize::new(0); unsafe { &*(&FOO as *const _ as *const usize) } //~^ WARN skipping const checks }; -const FOO: usize = { +const MUTATE_INTERIOR_MUT: usize = { static FOO: AtomicUsize = AtomicUsize::new(0); FOO.fetch_add(1, Ordering::Relaxed) //~ WARN any use of this value will cause an error //~^ WARN skipping const checks //~| WARN skipping const checks }; -const BAR: usize = { +const READ_INTERIOR_MUT: usize = { static FOO: AtomicUsize = AtomicUsize::new(0); unsafe { *(&FOO as *const _ as *const usize) } //~ WARN any use of this value will cause an err //~^ WARN skipping const checks }; static mut MUTABLE: u32 = 0; -const BAD: u32 = unsafe { MUTABLE }; //~ WARN any use of this value will cause an error +const READ_MUT: u32 = unsafe { MUTABLE }; //~ WARN any use of this value will cause an error //~^ WARN skipping const checks // ok some day perhaps -const BOO_OK: &usize = { //~ ERROR it is undefined behavior to use this value +const READ_IMMUT: &usize = { //~ ERROR it is undefined behavior to use this value static FOO: usize = 0; &FOO //~^ WARN skipping const checks diff --git a/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr b/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr index 6ae88558d7003..eae76c1389b62 100644 --- a/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr +++ b/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr @@ -23,10 +23,10 @@ LL | unsafe { *(&FOO as *const _ as *const usize) } | ^^^ warning: skipping const checks - --> $DIR/const_refers_to_static.rs:29:27 + --> $DIR/const_refers_to_static.rs:29:32 | -LL | const BAD: u32 = unsafe { MUTABLE }; - | ^^^^^^^ +LL | const READ_MUT: u32 = unsafe { MUTABLE }; + | ^^^^^^^ warning: skipping const checks --> $DIR/const_refers_to_static.rs:35:6 @@ -37,7 +37,7 @@ LL | &FOO error[E0080]: it is undefined behavior to use this value --> $DIR/const_refers_to_static.rs:9:1 | -LL | / const BOO: &usize = { +LL | / const REF_INTERIOR_MUT: &usize = { LL | | static FOO: AtomicUsize = AtomicUsize::new(0); LL | | unsafe { &*(&FOO as *const _ as *const usize) } LL | | @@ -49,7 +49,7 @@ LL | | }; warning: any use of this value will cause an error --> $DIR/const_refers_to_static.rs:17:5 | -LL | / const FOO: usize = { +LL | / const MUTATE_INTERIOR_MUT: usize = { LL | | static FOO: AtomicUsize = AtomicUsize::new(0); LL | | FOO.fetch_add(1, Ordering::Relaxed) | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling non-const function `std::sync::atomic::AtomicUsize::fetch_add` @@ -67,7 +67,7 @@ LL | #![warn(const_err)] warning: any use of this value will cause an error --> $DIR/const_refers_to_static.rs:24:14 | -LL | / const BAR: usize = { +LL | / const READ_INTERIOR_MUT: usize = { LL | | static FOO: AtomicUsize = AtomicUsize::new(0); LL | | unsafe { *(&FOO as *const _ as *const usize) } | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static @@ -76,17 +76,17 @@ LL | | }; | |__- warning: any use of this value will cause an error - --> $DIR/const_refers_to_static.rs:29:27 + --> $DIR/const_refers_to_static.rs:29:32 | -LL | const BAD: u32 = unsafe { MUTABLE }; - | --------------------------^^^^^^^--- - | | - | constant accesses static +LL | const READ_MUT: u32 = unsafe { MUTABLE }; + | -------------------------------^^^^^^^--- + | | + | constant accesses static error[E0080]: it is undefined behavior to use this value --> $DIR/const_refers_to_static.rs:33:1 | -LL | / const BOO_OK: &usize = { +LL | / const READ_IMMUT: &usize = { LL | | static FOO: usize = 0; LL | | &FOO LL | | diff --git a/src/test/ui/consts/miri_unleashed/drop.rs b/src/test/ui/consts/miri_unleashed/drop.rs new file mode 100644 index 0000000000000..d66ca53dfb8d3 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/drop.rs @@ -0,0 +1,20 @@ +// compile-flags: -Zunleash-the-miri-inside-of-you +// ignore-x86 FIXME: missing sysroot spans (#53081) +// error-pattern: calling non-const function ` as std::ops::Drop>::drop` +#![deny(const_err)] + +use std::mem::ManuallyDrop; + +fn main() {} + +static TEST_OK: () = { + let v: Vec = Vec::new(); + let _v = ManuallyDrop::new(v); +}; + +// Make sure we catch executing bad drop functions. +// The actual error is tested by the error-pattern above. +static TEST_BAD: () = { + let _v: Vec = Vec::new(); + //~^ WARN skipping const check +}; diff --git a/src/test/ui/consts/miri_unleashed/drop.stderr b/src/test/ui/consts/miri_unleashed/drop.stderr new file mode 100644 index 0000000000000..5603eeb6dc037 --- /dev/null +++ b/src/test/ui/consts/miri_unleashed/drop.stderr @@ -0,0 +1,24 @@ +warning: skipping const checks + --> $DIR/drop.rs:18:9 + | +LL | let _v: Vec = Vec::new(); + | ^^ + +error[E0080]: could not evaluate static initializer + --> $SRC_DIR/libcore/ptr/mod.rs:LL:COL + | +LL | / unsafe fn real_drop_in_place(to_drop: &mut T) { +LL | | // Code here does not matter - this is replaced by the +LL | | // real drop glue by the compiler. +LL | | real_drop_in_place(to_drop) +LL | | } + | |_^ calling non-const function ` as std::ops::Drop>::drop` + | + ::: $DIR/drop.rs:20:1 + | +LL | }; + | - inside call to `std::ptr::real_drop_in_place::> - shim(Some(std::vec::Vec))` at $DIR/drop.rs:20:1 + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0080`.