#[repr(transparent)]pub struct PinHelper<Ptr> {
pointer: Ptr,
}pin_derefmut_internals)Expand description
Helper that prevents downstream crates from implementing DerefMut for Pin.
The Pin type implements the unsafe trait PinCoerceUnsized, which essentially requires
that the type does not have a malicious Deref or DerefMut impl. However, without this
helper module, downstream crates are able to write impl DerefMut for Pin<LocalType> as
long as it does not overlap with the impl provided by stdlib. This is because Pin is
#[fundamental], so stdlib promises to never implement traits for Pin that it does not
implement today.
However, this is problematic. Downstream crates could implement DerefMut for
Pin<&LocalType>, and they could do so maliciously. To prevent this, the implementation for
Pin delegates to this helper module. Since helper::Pin is not #[fundamental], the
orphan rules assume that stdlib might implement helper::DerefMut for helper::Pin<&_> in
the future. Because of this, downstream crates can no longer provide an implementation of
DerefMut for Pin<&_>, as it might overlap with a trait impl that, according to the
orphan rules, the stdlib could introduce without a breaking change in a future release.
See https://github.com/rust-lang/rust/issues/85099 for the issue this fixes.
Fields§
§pointer: Ptrpin_derefmut_internals)Trait Implementations§
Source§impl<Ptr: DerefMut> PinDerefMutHelper for PinHelper<Ptr>
impl<Ptr: DerefMut> PinDerefMutHelper for PinHelper<Ptr>
Auto Trait Implementations§
impl<Ptr> Freeze for PinHelper<Ptr>where
Ptr: Freeze,
impl<Ptr> RefUnwindSafe for PinHelper<Ptr>where
Ptr: RefUnwindSafe,
impl<Ptr> Send for PinHelper<Ptr>where
Ptr: Send,
impl<Ptr> Sync for PinHelper<Ptr>where
Ptr: Sync,
impl<Ptr> Unpin for PinHelper<Ptr>where
Ptr: Unpin,
impl<Ptr> UnsafeUnpin for PinHelper<Ptr>where
Ptr: UnsafeUnpin,
impl<Ptr> UnwindSafe for PinHelper<Ptr>where
Ptr: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> SizedTypeProperties for T
impl<T> SizedTypeProperties for T
Source§#[doc(hidden)] const SIZE: usize = _
#[doc(hidden)] const SIZE: usize = _
sized_type_properties)Source§#[doc(hidden)] const ALIGN: usize = _
#[doc(hidden)] const ALIGN: usize = _
sized_type_properties)Source§#[doc(hidden)] const IS_ZST: bool = _
#[doc(hidden)] const IS_ZST: bool = _
sized_type_properties)Source§#[doc(hidden)] const LAYOUT: Layout = _
#[doc(hidden)] const LAYOUT: Layout = _
sized_type_properties)Source§#[doc(hidden)] const MAX_SLICE_LEN: usize = _
#[doc(hidden)] const MAX_SLICE_LEN: usize = _
sized_type_properties)[Self]. Read more