@@ -349,6 +349,18 @@ where
349349 // around pinning.
350350 unsafe { Pin :: new_unchecked ( pointer) }
351351 }
352+
353+ /// Unwraps this `Pin<P>` returning the underlying pointer.
354+ ///
355+ /// This requires that the data inside this `Pin` is [`Unpin`] so that we
356+ /// can ignore the pinning invariants when unwrapping it.
357+ ///
358+ /// [`Unpin`]: ../../std/marker/trait.Unpin.html
359+ #[ unstable( feature = "pin_into_inner" , issue = "60245" ) ]
360+ #[ inline( always) ]
361+ pub fn into_inner ( pin : Pin < P > ) -> P {
362+ pin. pointer
363+ }
352364}
353365
354366impl < P : Deref > Pin < P > {
@@ -434,6 +446,28 @@ impl<P: Deref> Pin<P> {
434446 pub fn as_ref ( self : & Pin < P > ) -> Pin < & P :: Target > {
435447 unsafe { Pin :: new_unchecked ( & * self . pointer ) }
436448 }
449+
450+ /// Unwraps this `Pin<P>` returning the underlying pointer.
451+ ///
452+ /// # Safety
453+ ///
454+ /// This function is unsafe. You must guarantee that you will continue to
455+ /// treat the pointer `P` as pinned after you call this function, so that
456+ /// the invariants on the `Pin` type can be upheld. If the code using the
457+ /// resulting `P` does not continue to maintain the pinning invariants that
458+ /// is a violation of the API contract and may lead to undefined behavior in
459+ /// later (safe) operations.
460+ ///
461+ /// If the underlying data is [`Unpin`], [`Pin::into_inner`] should be used
462+ /// instead.
463+ ///
464+ /// [`Unpin`]: ../../std/marker/trait.Unpin.html
465+ /// [`Pin::into_inner`]: #method.into_inner
466+ #[ unstable( feature = "pin_into_inner" , issue = "60245" ) ]
467+ #[ inline( always) ]
468+ pub unsafe fn into_inner_unchecked ( pin : Pin < P > ) -> P {
469+ pin. pointer
470+ }
437471}
438472
439473impl < P : DerefMut > Pin < P > {
0 commit comments