Closed RalfJung closed 3 months ago
The following program used to work, but now it fails:
use std::{ cell::UnsafeCell, sync::atomic::{AtomicPtr, Ordering}, }; #[repr(C)] #[derive(Default)] struct Node { _meta: UnsafeCell<usize>, value: usize, } impl Node { fn value(&self) -> &usize { &self.value } } fn main() { unsafe { let a = Box::into_raw(Box::new(Node::default())); let ptr = &*a; *UnsafeCell::raw_get(a.cast::<UnsafeCell<usize>>()) = 2; println!("{}", ptr.value()); } }
That is caused by https://github.com/rust-lang/rust/issues/122647. That PR even has a commenting about this situation -- code doing a box-to-raw cast while being generic over the allocator is just not something we can handle properly.
The following program used to work, but now it fails:
That is caused by https://github.com/rust-lang/rust/issues/122647. That PR even has a commenting about this situation -- code doing a box-to-raw cast while being generic over the allocator is just not something we can handle properly.