add test for const-ref-to-cross-crate-mutable-static

This commit is contained in:
Ralf Jung 2020-04-28 23:49:36 +02:00
parent e8ffa2182b
commit a84e2a0c91
7 changed files with 101 additions and 14 deletions

View File

@ -0,0 +1 @@
pub static mut ZERO: [u8; 1] = [0];

View File

@ -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);

View File

@ -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

View File

@ -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

View File

@ -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 | |

View File

@ -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]);
}

View File

@ -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`.