]> git.lizzy.rs Git - rust.git/blob - tests/ui/consts/issue-69488.rs
Auto merge of #106090 - WaffleLapkin:dereffffffffff, r=Nilstrieb
[rust.git] / tests / ui / consts / issue-69488.rs
1 // run-pass
2
3 #![feature(const_ptr_write)]
4 #![feature(const_mut_refs)]
5
6 // Or, equivalently: `MaybeUninit`.
7 pub union BagOfBits<T: Copy> {
8     uninit: (),
9     _storage: T,
10 }
11
12 pub const fn make_1u8_bag<T: Copy>() -> BagOfBits<T> {
13     assert!(core::mem::size_of::<T>() >= 1);
14     let mut bag = BagOfBits { uninit: () };
15     unsafe { (&mut bag as *mut _ as *mut u8).write(1); };
16     bag
17 }
18
19 pub fn check_bag<T: Copy>(bag: &BagOfBits<T>) {
20     let val = unsafe { (bag as *const _ as *const u8).read() };
21     assert_eq!(val, 1);
22 }
23
24 fn main() {
25     check_bag(&make_1u8_bag::<[usize; 1]>()); // Fine
26     check_bag(&make_1u8_bag::<usize>()); // Fine
27
28     const CONST_ARRAY_BAG: BagOfBits<[usize; 1]> = make_1u8_bag();
29     check_bag(&CONST_ARRAY_BAG); // Fine.
30     const CONST_USIZE_BAG: BagOfBits<usize> = make_1u8_bag();
31
32     // Used to panic since CTFE would make the entire `BagOfBits<usize>` uninit
33     check_bag(&CONST_USIZE_BAG);
34 }