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.).
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.)
- Implementation: add CloneFromCell and Cell::get_cloned #145685
- Final comment period (FCP)1
- Stabilization PR
Unresolved Questions
- Should this remain
get_clonedor move to theCloneimpl forCell? Add Cell::get for Rc-like shallow-copying types libs-team#572 (comment) - Concern: the soundness conditions here are extremely tricky to get right. We need to have a warning about this.
- The soundness requirement on
CloneFromCopyas stated above is likely wrong.
cc @rust-lang/libs-api @rust-lang/lang