pub unsafe trait CloneFromCell: Clone { }
🔬This is a nightly-only experimental API. (
cell_get_cloned
#145329)Expand description
Types for which cloning Cell<Self>
is sound.
§Safety
Implementing this trait for a type is sound if and only if the following code is sound for T = that type.
#![feature(cell_get_cloned)]
fn clone_from_cell<T: CloneFromCell>(cell: &Cell<T>) -> T {
unsafe { T::clone(&*cell.as_ptr()) }
}
Importantly, you can’t just implement CloneFromCell
for any arbitrary Copy
type, e.g. the
following is unsound:
#![feature(cell_get_cloned)]
#[derive(Copy, Debug)]
pub struct Bad<'a>(Option<&'a Cell<Bad<'a>>>, u8);
impl Clone for Bad<'_> {
fn clone(&self) -> Self {
let a: &u8 = &self.1;
// when self.0 points to self, we write to self.1 while we have a live `&u8` pointing to
// it -- this is UB
self.0.unwrap().set(Self(None, 1));
dbg!((a, self));
Self(None, 0)
}
}
// this is not sound
// unsafe impl CloneFromCell for Bad<'_> {}
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.
Implementors§
impl<T: CloneFromCell> CloneFromCell for Option<T>
impl<T: CloneFromCell> CloneFromCell for (T₁, T₂, …, Tₙ)
This trait is implemented for tuples up to twelve items long.