2019-02-10 07:59:13 -06:00
|
|
|
// 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
|
|
|
|
|
2019-11-28 10:38:07 -06:00
|
|
|
// this is fine because is not possible to mutate through an immutable reference.
|
2019-02-10 07:59:13 -06:00
|
|
|
static FOO: &&mut u32 = &&mut 42;
|
|
|
|
|
2019-11-28 10:38:07 -06:00
|
|
|
// this is fine because accessing an immutable static `BAR` is equivalent to accessing `*&BAR`
|
|
|
|
// which puts the mutable reference behind an immutable one.
|
2019-02-10 07:59:13 -06:00
|
|
|
static BAR: &mut () = &mut ();
|
|
|
|
|
|
|
|
struct Foo<T>(T);
|
|
|
|
|
2019-11-28 10:38:07 -06:00
|
|
|
// this is fine for the same reason as `BAR`.
|
2019-02-10 07:59:13 -06:00
|
|
|
static BOO: &mut Foo<()> = &mut Foo(());
|
|
|
|
|
2020-04-29 03:00:22 -05:00
|
|
|
// interior mutability is fine
|
2019-02-10 07:59:13 -06:00
|
|
|
struct Meh {
|
|
|
|
x: &'static UnsafeCell<i32>,
|
|
|
|
}
|
|
|
|
unsafe impl Sync for Meh {}
|
2020-05-03 07:23:08 -05:00
|
|
|
static MEH: Meh = Meh {
|
2019-02-10 07:59:13 -06:00
|
|
|
x: &UnsafeCell::new(42),
|
|
|
|
};
|
|
|
|
|
2019-11-28 10:38:07 -06:00
|
|
|
// this is fine for the same reason as `BAR`.
|
2019-02-10 07:59:13 -06:00
|
|
|
static OH_YES: &mut i32 = &mut 42;
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
unsafe {
|
2019-09-17 18:25:25 -05:00
|
|
|
*MEH.x.get() = 99;
|
2019-02-10 07:59:13 -06:00
|
|
|
}
|
|
|
|
*OH_YES = 99; //~ ERROR cannot assign to `*OH_YES`, as `OH_YES` is an immutable static item
|
|
|
|
}
|