Tracking Issue for cell_get_cloned (original) (raw)

Feature gate: #![feature(cell_get_cloned)]

This is a tracking issue for Cell::get_cloned for T: CloneFromCopy (e.g. Rc<T>, Arc<T>, etc.).

ACP: rust-lang/libs-team#572

Public API

/// Safety: can call Self::clone(&*ManuallyDrop::new(ptr::read(ptr_to_self))) #[marker] pub unsafe trait CloneFromCopy: Clone {}

// Can't do this, unsound // unsafe impl<T: Copy> CloneFromCopy for T {}

unsafe impl<T: ?Sized> CloneFromCopy for Rc {} unsafe impl<T: ?Sized> CloneFromCopy for Arc {} unsafe impl<T: ?Sized> CloneFromCopy for rc::Weak {} unsafe impl<T: ?Sized> CloneFromCopy for sync::Weak {}

// basically all std types that don't have indirection: unsafe impl<T: CloneFromCopy, const N: usize> CloneFromCopy for [T; N] {} unsafe impl<T: CloneFromCopy> CloneFromCopy for Option {} unsafe impl<T: CloneFromCopy, E: CloneFromCopy> CloneFromCopy for Result<T, E> {} // ...

impl<T: CloneFromCopy> Cell { pub fn get_cloned(&self) -> Self; }

Steps / History

(Remember to update the S-tracking-* label when checking boxes.)

Unresolved Questions

cc @rust-lang/libs-api @rust-lang/lang

  1. https://std-dev-guide.rust-lang.org/feature-lifecycle/stabilization.html