1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
// compile-flags: -Zunleash-the-miri-inside-of-you
use std::cell::UnsafeCell;
// a test demonstrating what things we could allow with a smarter const qualification
// this is fine because is not possible to mutate through an immutable reference.
static FOO: &&mut u32 = &&mut 42;
// this is fine because accessing an immutable static `BAR` is equivalent to accessing `*&BAR`
// which puts the mutable reference behind an immutable one.
static BAR: &mut () = &mut ();
struct Foo<T>(T);
// this is fine for the same reason as `BAR`.
static BOO: &mut Foo<()> = &mut Foo(());
// interior mutability is fine
struct Meh {
x: &'static UnsafeCell<i32>,
}
unsafe impl Sync for Meh {}
static MEH: Meh = Meh {
x: &UnsafeCell::new(42),
};
// this is fine for the same reason as `BAR`.
static OH_YES: &mut i32 = &mut 42;
fn main() {
unsafe {
*MEH.x.get() = 99;
}
*OH_YES = 99; //~ ERROR cannot assign to `*OH_YES`, as `OH_YES` is an immutable static item
}
|