CloneFromCell

Trait CloneFromCell 

Source
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ยง

Sourceยง

impl<T> CloneFromCell for Option<T>
where T: CloneFromCell,

Sourceยง

impl<T> CloneFromCell for (Tโ‚, Tโ‚‚, โ€ฆ, Tโ‚™)
where T: CloneFromCell,

This trait is implemented for tuples up to twelve items long.

Sourceยง

impl<T> CloneFromCell for PhantomData<T>
where T: ?Sized,

Sourceยง

impl<T> CloneFromCell for ManuallyDrop<T>
where T: CloneFromCell,

Sourceยง

impl<T> CloneFromCell for std::ops::Range<T>
where T: CloneFromCell,

Sourceยง

impl<T> CloneFromCell for std::range::Range<T>
where T: CloneFromCell,

Sourceยง

impl<T> CloneFromCell for Rc<T>
where T: ?Sized,

Sourceยง

impl<T> CloneFromCell for std::rc::Weak<T>
where T: ?Sized,

Sourceยง

impl<T> CloneFromCell for Arc<T>
where T: ?Sized,

Sourceยง

impl<T> CloneFromCell for std::sync::Weak<T>
where T: ?Sized,

Sourceยง

impl<T, E> CloneFromCell for Result<T, E>

Sourceยง

impl<T, const N: usize> CloneFromCell for [T; N]
where T: CloneFromCell,