Make some methods of `Pin` unstable const
Make the following methods unstable const under the `const_pin` feature: - `new` - `new_unchecked` - `into_inner` - `into_inner_unchecked` - `get_ref` - `into_ref` Also adds tests for these methods in a const context. Tracking issue: #76654
This commit is contained in:
parent
989190874f
commit
8f27e3cb1b
|
@ -80,6 +80,7 @@
|
||||||
#![feature(const_int_pow)]
|
#![feature(const_int_pow)]
|
||||||
#![feature(constctlz)]
|
#![feature(constctlz)]
|
||||||
#![feature(const_panic)]
|
#![feature(const_panic)]
|
||||||
|
#![feature(const_pin)]
|
||||||
#![feature(const_fn_union)]
|
#![feature(const_fn_union)]
|
||||||
#![feature(const_generics)]
|
#![feature(const_generics)]
|
||||||
#![feature(const_option)]
|
#![feature(const_option)]
|
||||||
|
|
|
@ -471,9 +471,10 @@ impl<P: Deref<Target: Unpin>> Pin<P> {
|
||||||
///
|
///
|
||||||
/// Unlike `Pin::new_unchecked`, this method is safe because the pointer
|
/// Unlike `Pin::new_unchecked`, this method is safe because the pointer
|
||||||
/// `P` dereferences to an [`Unpin`] type, which cancels the pinning guarantees.
|
/// `P` dereferences to an [`Unpin`] type, which cancels the pinning guarantees.
|
||||||
#[stable(feature = "pin", since = "1.33.0")]
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn new(pointer: P) -> Pin<P> {
|
#[rustc_const_unstable(feature = "const_pin", issue = "76654")]
|
||||||
|
#[stable(feature = "pin", since = "1.33.0")]
|
||||||
|
pub const fn new(pointer: P) -> Pin<P> {
|
||||||
// SAFETY: the value pointed to is `Unpin`, and so has no requirements
|
// SAFETY: the value pointed to is `Unpin`, and so has no requirements
|
||||||
// around pinning.
|
// around pinning.
|
||||||
unsafe { Pin::new_unchecked(pointer) }
|
unsafe { Pin::new_unchecked(pointer) }
|
||||||
|
@ -483,9 +484,10 @@ impl<P: Deref<Target: Unpin>> Pin<P> {
|
||||||
///
|
///
|
||||||
/// This requires that the data inside this `Pin` is [`Unpin`] so that we
|
/// This requires that the data inside this `Pin` is [`Unpin`] so that we
|
||||||
/// can ignore the pinning invariants when unwrapping it.
|
/// can ignore the pinning invariants when unwrapping it.
|
||||||
#[stable(feature = "pin_into_inner", since = "1.39.0")]
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn into_inner(pin: Pin<P>) -> P {
|
#[rustc_const_unstable(feature = "const_pin", issue = "76654")]
|
||||||
|
#[stable(feature = "pin_into_inner", since = "1.39.0")]
|
||||||
|
pub const fn into_inner(pin: Pin<P>) -> P {
|
||||||
pin.pointer
|
pin.pointer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -556,9 +558,10 @@ impl<P: Deref> Pin<P> {
|
||||||
///
|
///
|
||||||
/// [`mem::swap`]: crate::mem::swap
|
/// [`mem::swap`]: crate::mem::swap
|
||||||
#[lang = "new_unchecked"]
|
#[lang = "new_unchecked"]
|
||||||
#[stable(feature = "pin", since = "1.33.0")]
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub unsafe fn new_unchecked(pointer: P) -> Pin<P> {
|
#[rustc_const_unstable(feature = "const_pin", issue = "76654")]
|
||||||
|
#[stable(feature = "pin", since = "1.33.0")]
|
||||||
|
pub const unsafe fn new_unchecked(pointer: P) -> Pin<P> {
|
||||||
Pin { pointer }
|
Pin { pointer }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -589,9 +592,10 @@ impl<P: Deref> Pin<P> {
|
||||||
///
|
///
|
||||||
/// If the underlying data is [`Unpin`], [`Pin::into_inner`] should be used
|
/// If the underlying data is [`Unpin`], [`Pin::into_inner`] should be used
|
||||||
/// instead.
|
/// instead.
|
||||||
#[stable(feature = "pin_into_inner", since = "1.39.0")]
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub unsafe fn into_inner_unchecked(pin: Pin<P>) -> P {
|
#[rustc_const_unstable(feature = "const_pin", issue = "76654")]
|
||||||
|
#[stable(feature = "pin_into_inner", since = "1.39.0")]
|
||||||
|
pub const unsafe fn into_inner_unchecked(pin: Pin<P>) -> P {
|
||||||
pin.pointer
|
pin.pointer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -693,17 +697,18 @@ impl<'a, T: ?Sized> Pin<&'a T> {
|
||||||
/// with the same lifetime as the original `Pin`.
|
/// with the same lifetime as the original `Pin`.
|
||||||
///
|
///
|
||||||
/// ["pinning projections"]: self#projections-and-structural-pinning
|
/// ["pinning projections"]: self#projections-and-structural-pinning
|
||||||
#[stable(feature = "pin", since = "1.33.0")]
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn get_ref(self) -> &'a T {
|
#[rustc_const_unstable(feature = "const_pin", issue = "76654")]
|
||||||
|
#[stable(feature = "pin", since = "1.33.0")]
|
||||||
|
pub const fn get_ref(self) -> &'a T {
|
||||||
self.pointer
|
self.pointer
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: ?Sized> Pin<&'a mut T> {
|
impl<'a, T: ?Sized> Pin<&'a mut T> {
|
||||||
/// Converts this `Pin<&mut T>` into a `Pin<&T>` with the same lifetime.
|
/// Converts this `Pin<&mut T>` into a `Pin<&T>` with the same lifetime.
|
||||||
#[stable(feature = "pin", since = "1.33.0")]
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
|
#[stable(feature = "pin", since = "1.33.0")]
|
||||||
pub fn into_ref(self) -> Pin<&'a T> {
|
pub fn into_ref(self) -> Pin<&'a T> {
|
||||||
Pin { pointer: self.pointer }
|
Pin { pointer: self.pointer }
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#![feature(iter_order_by)]
|
#![feature(iter_order_by)]
|
||||||
#![feature(cmp_min_max_by)]
|
#![feature(cmp_min_max_by)]
|
||||||
#![feature(iter_map_while)]
|
#![feature(iter_map_while)]
|
||||||
|
#![feature(const_pin)]
|
||||||
#![feature(const_slice_from_raw_parts)]
|
#![feature(const_slice_from_raw_parts)]
|
||||||
#![feature(const_raw_ptr_deref)]
|
#![feature(const_raw_ptr_deref)]
|
||||||
#![feature(never_type)]
|
#![feature(never_type)]
|
||||||
|
@ -74,6 +75,7 @@ mod num;
|
||||||
mod ops;
|
mod ops;
|
||||||
mod option;
|
mod option;
|
||||||
mod pattern;
|
mod pattern;
|
||||||
|
mod pin;
|
||||||
mod ptr;
|
mod ptr;
|
||||||
mod result;
|
mod result;
|
||||||
mod slice;
|
mod slice;
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
use core::pin::Pin;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn pin_const() {
|
||||||
|
// test that the methods of `Pin` are usable in a const context
|
||||||
|
|
||||||
|
const POINTER: &'static usize = &2;
|
||||||
|
|
||||||
|
const PINNED: Pin<&'static usize> = Pin::new(POINTER);
|
||||||
|
const PINNED_UNCHECKED: Pin<&'static usize> = unsafe { Pin::new_unchecked(POINTER) };
|
||||||
|
assert_eq!(PINNED_UNCHECKED, PINNED);
|
||||||
|
|
||||||
|
const INNER: &'static usize = Pin::into_inner(PINNED);
|
||||||
|
assert_eq!(INNER, POINTER);
|
||||||
|
|
||||||
|
const INNER_UNCHECKED: &'static usize = unsafe { Pin::into_inner_unchecked(PINNED) };
|
||||||
|
assert_eq!(INNER_UNCHECKED, POINTER);
|
||||||
|
|
||||||
|
const REF: &'static usize = PINNED.get_ref();
|
||||||
|
assert_eq!(REF, POINTER)
|
||||||
|
}
|
Loading…
Reference in New Issue