]>
Commit | Line | Data |
---|---|---|
04454e1e FG |
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 | } |