summaryrefslogtreecommitdiffstats
path: root/src/test/ui/consts/miri_unleashed/mutable_references.rs
blob: ca927ef4a518b0226ffff0ad9efe4db2ae3122bc (plain)
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
37
// compile-flags: -Zunleash-the-miri-inside-of-you
#![allow(const_err)]

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
}