about summary refs log tree commit diff
path: root/tests/ui/consts/static-promoted-to-mutable-static.rs
blob: 1cf72781e458254570681b511bf6cb758eb781f7 (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
//@ check-pass
#![allow(non_camel_case_types, non_upper_case_globals, static_mut_ref)]

pub struct wl_interface {
    pub version: i32
}

pub struct Interface {
    pub other_interfaces: &'static [&'static Interface],
    pub c_ptr: Option<&'static wl_interface>,
}

pub static mut wl_callback_interface: wl_interface = wl_interface {
    version: 0,
};

pub static WL_CALLBACK_INTERFACE: Interface = Interface {
    other_interfaces: &[],
    c_ptr: Some(unsafe { &wl_callback_interface }),
};

// This static contains a promoted that points to a static that points to a mutable static.
pub static WL_SURFACE_INTERFACE: Interface = Interface {
    other_interfaces: &[&WL_CALLBACK_INTERFACE],
    c_ptr: None,
};

// And another variant of the same thing, this time with interior mutability.
use std::sync::OnceLock;
static LAZY_INIT: OnceLock<u32> = OnceLock::new();
static LAZY_INIT_REF: &[&OnceLock<u32>] = &[&LAZY_INIT];

fn main() {}