Struct PinHelper
#[repr(transparent)]
pub struct PinHelper<Ptr> { pub(in ::pin::helper) pointer: Ptr }
Helper that prevents downstream crates from implementing DerefMut for Pin.
The Pin type implements the unsafe trait PinSafePointer, 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: Ptr
Trait Implementations
impl<Ptr: ~const DerefMut> PinDerefMutHelper for PinHelper<Ptr>
where
Ptr::Target: Unpin,
type Target = <Ptr as Deref>::Target;fn deref_mut(&mut self) -> &mut Ptr::Target
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
impl<T> Any for PinHelper<Ptr>
where
T: 'static + ?Sized,
fn type_id(&self) -> TypeId
impl<T> Borrow<T> for PinHelper<Ptr>
where
T: ?Sized,
fn borrow(&self) -> &T
impl<T> BorrowMut<T> for PinHelper<Ptr>
where
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T
impl<T> From<T> for PinHelper<Ptr>
fn from(t: T) -> TReturns the argument unchanged.
impl<T> SizeHint for PinHelper<Ptr>
where
T: ?Sized,
fn lower_bound(&self) -> usizefn upper_bound(&self) -> Option<usize>
impl<T> SizedTypeProperties for PinHelper<Ptr>
impl<T, U> Into<U> for PinHelper<Ptr>
where
U: From<T>,
fn into(self) -> UCalls
U::from(self).That is, this conversion is whatever the implementation of
[From]<T> for Uchooses to do.
impl<T, U> TryFrom<U> for PinHelper<Ptr>
where
U: Into<T>,
type Error = Infallible;fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
impl<T, U> TryInto<U> for PinHelper<Ptr>
where
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error;fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>