Closed
Description
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 rust-lang/rust#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.
Metadata
Metadata
Assignees
Labels
No labels