add test for const-ref-to-cross-crate-mutable-static
This commit is contained in:
parent
e8ffa2182b
commit
a84e2a0c91
@ -0,0 +1 @@
|
||||
pub static mut ZERO: [u8; 1] = [0];
|
@ -7,7 +7,8 @@
|
||||
use std::sync::atomic::AtomicUsize;
|
||||
use std::sync::atomic::Ordering;
|
||||
|
||||
// These tests only cause an error when *using* the const.
|
||||
// These fail during CTFE (as they read a static), so they only cause an error
|
||||
// when *using* the const.
|
||||
|
||||
const MUTATE_INTERIOR_MUT: usize = {
|
||||
static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
|
@ -1,47 +1,47 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:14:5
|
||||
--> $DIR/const_refers_to_static.rs:15:5
|
||||
|
|
||||
LL | FOO.fetch_add(1, Ordering::Relaxed)
|
||||
| ^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:14:5
|
||||
--> $DIR/const_refers_to_static.rs:15:5
|
||||
|
|
||||
LL | FOO.fetch_add(1, Ordering::Relaxed)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:21:17
|
||||
--> $DIR/const_refers_to_static.rs:22:17
|
||||
|
|
||||
LL | unsafe { *(&FOO as *const _ as *const usize) }
|
||||
| ^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:26:32
|
||||
--> $DIR/const_refers_to_static.rs:27:32
|
||||
|
|
||||
LL | const READ_MUT: u32 = unsafe { MUTABLE };
|
||||
| ^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static.rs:26:32
|
||||
--> $DIR/const_refers_to_static.rs:27:32
|
||||
|
|
||||
LL | const READ_MUT: u32 = unsafe { MUTABLE };
|
||||
| ^^^^^^^
|
||||
|
||||
error[E0080]: erroneous constant used
|
||||
--> $DIR/const_refers_to_static.rs:31:5
|
||||
--> $DIR/const_refers_to_static.rs:32:5
|
||||
|
|
||||
LL | MUTATE_INTERIOR_MUT;
|
||||
| ^^^^^^^^^^^^^^^^^^^ referenced constant has errors
|
||||
|
||||
error[E0080]: erroneous constant used
|
||||
--> $DIR/const_refers_to_static.rs:33:5
|
||||
--> $DIR/const_refers_to_static.rs:34:5
|
||||
|
|
||||
LL | READ_INTERIOR_MUT;
|
||||
| ^^^^^^^^^^^^^^^^^ referenced constant has errors
|
||||
|
||||
error[E0080]: erroneous constant used
|
||||
--> $DIR/const_refers_to_static.rs:35:5
|
||||
--> $DIR/const_refers_to_static.rs:36:5
|
||||
|
|
||||
LL | READ_MUT;
|
||||
| ^^^^^^^^ referenced constant has errors
|
||||
|
@ -6,9 +6,12 @@
|
||||
use std::sync::atomic::AtomicUsize;
|
||||
use std::sync::atomic::Ordering;
|
||||
|
||||
// These tests cause immediate error when *defining* the const.
|
||||
// These only fail during validation (they do not use but just create a reference to a static),
|
||||
// so they cause an immediate error when *defining* the const.
|
||||
|
||||
const REF_INTERIOR_MUT: &usize = { //~ ERROR undefined behavior to use this value
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
unsafe { &*(&FOO as *const _ as *const usize) }
|
||||
//~^ WARN skipping const checks
|
||||
@ -16,6 +19,8 @@
|
||||
|
||||
// ok some day perhaps
|
||||
const READ_IMMUT: &usize = { //~ ERROR it is undefined behavior to use this value
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
static FOO: usize = 0;
|
||||
&FOO
|
||||
//~^ WARN skipping const checks
|
||||
|
@ -1,19 +1,21 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static2.rs:13:18
|
||||
--> $DIR/const_refers_to_static2.rs:16:18
|
||||
|
|
||||
LL | unsafe { &*(&FOO as *const _ as *const usize) }
|
||||
| ^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static2.rs:20:6
|
||||
--> $DIR/const_refers_to_static2.rs:25:6
|
||||
|
|
||||
LL | &FOO
|
||||
| ^^^
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const_refers_to_static2.rs:11:1
|
||||
--> $DIR/const_refers_to_static2.rs:12:1
|
||||
|
|
||||
LL | / const REF_INTERIOR_MUT: &usize = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | static FOO: AtomicUsize = AtomicUsize::new(0);
|
||||
LL | | unsafe { &*(&FOO as *const _ as *const usize) }
|
||||
LL | |
|
||||
@ -23,9 +25,11 @@ LL | | };
|
||||
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const_refers_to_static2.rs:18:1
|
||||
--> $DIR/const_refers_to_static2.rs:21:1
|
||||
|
|
||||
LL | / const READ_IMMUT: &usize = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | static FOO: usize = 0;
|
||||
LL | | &FOO
|
||||
LL | |
|
||||
|
@ -0,0 +1,35 @@
|
||||
// compile-flags: -Zunleash-the-miri-inside-of-you
|
||||
// aux-build:static_cross_crate.rs
|
||||
#![allow(const_err)]
|
||||
|
||||
#![feature(exclusive_range_pattern)]
|
||||
#![feature(half_open_range_patterns)]
|
||||
|
||||
extern crate static_cross_crate;
|
||||
|
||||
// Sneaky: reference to a mutable static.
|
||||
// Allowing this would be a disaster for pattern matching, we could violate exhaustiveness checking!
|
||||
const SLICE_MUT: &[u8; 1] = { //~ ERROR undefined behavior to use this value
|
||||
//~| NOTE encountered a reference pointing to a static variable
|
||||
//~| NOTE
|
||||
unsafe { &static_cross_crate::ZERO }
|
||||
//~^ WARN skipping const checks
|
||||
//~| WARN skipping const checks
|
||||
};
|
||||
|
||||
pub fn test(x: &[u8; 1]) -> bool {
|
||||
match x {
|
||||
SLICE_MUT => true,
|
||||
//~^ ERROR could not evaluate constant pattern
|
||||
//~| ERROR could not evaluate constant pattern
|
||||
&[1..] => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
unsafe {
|
||||
static_cross_crate::ZERO[0] = 1;
|
||||
}
|
||||
// Now the pattern is not exhaustive any more!
|
||||
test(&[0]);
|
||||
}
|
@ -0,0 +1,41 @@
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:15:15
|
||||
|
|
||||
LL | unsafe { &static_cross_crate::ZERO }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: skipping const checks
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:15:15
|
||||
|
|
||||
LL | unsafe { &static_cross_crate::ZERO }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0080]: it is undefined behavior to use this value
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:12:1
|
||||
|
|
||||
LL | / const SLICE_MUT: &[u8; 1] = {
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | unsafe { &static_cross_crate::ZERO }
|
||||
LL | |
|
||||
LL | |
|
||||
LL | | };
|
||||
| |__^ type validation failed: encountered a reference pointing to a static variable
|
||||
|
|
||||
= note: The rules on what exactly is undefined behavior aren't clear, so this check might be overzealous. Please open an issue on the rustc repository if you believe it should not be considered undefined behavior.
|
||||
|
||||
error: could not evaluate constant pattern
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:22:9
|
||||
|
|
||||
LL | SLICE_MUT => true,
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: could not evaluate constant pattern
|
||||
--> $DIR/const_refers_to_static_cross_crate.rs:22:9
|
||||
|
|
||||
LL | SLICE_MUT => true,
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to 3 previous errors; 2 warnings emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0080`.
|
Loading…
Reference in New Issue
Block a user