| //! This test checks the one code path that does not go through | |
| //! the regular CTFE memory access (as an optimization). We forgot | |
| //! to duplicate the static item self-initialization check, allowing | |
| //! reading from the uninitialized static memory before it was | |
| //! initialized at the end of the static initializer. | |
| //! | |
| //! https://github.com/rust-lang/rust/issues/142532 | |
| use std::mem::MaybeUninit; | |
| pub static X: (i32, MaybeUninit<i32>) = (1, foo(&X.0, 1)); | |
| //~^ ERROR: encountered static that tried to access itself during initialization | |
| pub static Y: (i32, MaybeUninit<i32>) = (1, foo(&Y.0, 0)); | |
| //~^ ERROR: encountered static that tried to access itself during initialization | |
| const fn foo(x: &i32, num: usize) -> MaybeUninit<i32> { | |
| let mut temp = MaybeUninit::<i32>::uninit(); | |
| unsafe { | |
| std::ptr::copy(x, temp.as_mut_ptr(), num); | |
| } | |
| temp | |
| } | |
| fn main() {} |