mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 14:55:26 +00:00
Auto merge of #67580 - RalfJung:miri-unleash-tests, r=oli-obk
test the unleashed Miri In particular, test what happens when we try to drop something. Cc https://github.com/rust-lang/const-eval/issues/17 r? @oli-obk
This commit is contained in:
commit
b13d65ab92
@ -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
|
||||
|
@ -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 | |
|
||||
|
20
src/test/ui/consts/miri_unleashed/drop.rs
Normal file
20
src/test/ui/consts/miri_unleashed/drop.rs
Normal file
@ -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 `<std::vec::Vec<i32> as std::ops::Drop>::drop`
|
||||
#![deny(const_err)]
|
||||
|
||||
use std::mem::ManuallyDrop;
|
||||
|
||||
fn main() {}
|
||||
|
||||
static TEST_OK: () = {
|
||||
let v: Vec<i32> = 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<i32> = Vec::new();
|
||||
//~^ WARN skipping const check
|
||||
};
|
24
src/test/ui/consts/miri_unleashed/drop.stderr
Normal file
24
src/test/ui/consts/miri_unleashed/drop.stderr
Normal file
@ -0,0 +1,24 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/drop.rs:18:9
|
||||
|
|
||||
LL | let _v: Vec<i32> = Vec::new();
|
||||
| ^^
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $SRC_DIR/libcore/ptr/mod.rs:LL:COL
|
||||
|
|
||||
LL | / unsafe fn real_drop_in_place<T: ?Sized>(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 `<std::vec::Vec<i32> as std::ops::Drop>::drop`
|
||||
|
|
||||
::: $DIR/drop.rs:20:1
|
||||
|
|
||||
LL | };
|
||||
| - inside call to `std::ptr::real_drop_in_place::<std::vec::Vec<i32>> - shim(Some(std::vec::Vec<i32>))` at $DIR/drop.rs:20:1
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
Loading…
Reference in New Issue
Block a user