Stabilize Pin

This commit is contained in:
Taylor Cramer 2018-12-17 18:14:07 -08:00
parent 20d694a95f
commit 610bcaf6f3
12 changed files with 39 additions and 41 deletions

View File

@ -111,7 +111,7 @@ impl<T> Box<T> {
box x box x
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn pinned(x: T) -> Pin<Box<T>> { pub fn pinned(x: T) -> Pin<Box<T>> {
(box x).into() (box x).into()
@ -446,7 +446,7 @@ impl<T> From<T> for Box<T> {
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<T> From<Box<T>> for Pin<Box<T>> { impl<T> From<Box<T>> for Pin<Box<T>> {
fn from(boxed: Box<T>) -> Self { fn from(boxed: Box<T>) -> Self {
// It's not possible to move or replace the insides of a `Pin<Box<T>>` // It's not possible to move or replace the insides of a `Pin<Box<T>>`
@ -813,7 +813,7 @@ impl<T: ?Sized> AsMut<T> for Box<T> {
* implementation of `Unpin` (where `T: Unpin`) would be valid/safe, and * implementation of `Unpin` (where `T: Unpin`) would be valid/safe, and
* could have a method to project a Pin<T> from it. * could have a method to project a Pin<T> from it.
*/ */
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<T: ?Sized> Unpin for Box<T> { } impl<T: ?Sized> Unpin for Box<T> { }
#[unstable(feature = "generator_trait", issue = "43122")] #[unstable(feature = "generator_trait", issue = "43122")]

View File

@ -100,7 +100,6 @@
#![feature(nll)] #![feature(nll)]
#![feature(optin_builtin_traits)] #![feature(optin_builtin_traits)]
#![feature(pattern)] #![feature(pattern)]
#![feature(pin)]
#![feature(ptr_internals)] #![feature(ptr_internals)]
#![feature(ptr_offset_from)] #![feature(ptr_offset_from)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]

View File

@ -325,7 +325,7 @@ impl<T> Rc<T> {
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub fn pinned(value: T) -> Pin<Rc<T>> { pub fn pinned(value: T) -> Pin<Rc<T>> {
unsafe { Pin::new_unchecked(Rc::new(value)) } unsafe { Pin::new_unchecked(Rc::new(value)) }
} }
@ -1931,5 +1931,5 @@ impl<T: ?Sized> AsRef<T> for Rc<T> {
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<T: ?Sized> Unpin for Rc<T> { } impl<T: ?Sized> Unpin for Rc<T> { }

View File

@ -303,7 +303,7 @@ impl<T> Arc<T> {
Arc { ptr: Box::into_raw_non_null(x), phantom: PhantomData } Arc { ptr: Box::into_raw_non_null(x), phantom: PhantomData }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub fn pinned(data: T) -> Pin<Arc<T>> { pub fn pinned(data: T) -> Pin<Arc<T>> {
unsafe { Pin::new_unchecked(Arc::new(data)) } unsafe { Pin::new_unchecked(Arc::new(data)) }
} }
@ -2047,5 +2047,5 @@ impl<T: ?Sized> AsRef<T> for Arc<T> {
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<T: ?Sized> Unpin for Arc<T> { } impl<T: ?Sized> Unpin for Arc<T> { }

View File

@ -637,23 +637,23 @@ unsafe impl<T: ?Sized> Freeze for &mut T {}
/// [`replace`]: ../../std/mem/fn.replace.html /// [`replace`]: ../../std/mem/fn.replace.html
/// [`Pin`]: ../pin/struct.Pin.html /// [`Pin`]: ../pin/struct.Pin.html
/// [`pin module`]: ../../std/pin/index.html /// [`pin module`]: ../../std/pin/index.html
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub auto trait Unpin {} pub auto trait Unpin {}
/// A marker type which does not implement `Unpin`. /// A marker type which does not implement `Unpin`.
/// ///
/// If a type contains a `PhantomPinned`, it will not implement `Unpin` by default. /// If a type contains a `PhantomPinned`, it will not implement `Unpin` by default.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)] #[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct PhantomPinned; pub struct PhantomPinned;
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl !Unpin for PhantomPinned {} impl !Unpin for PhantomPinned {}
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<'a, T: ?Sized + 'a> Unpin for &'a T {} impl<'a, T: ?Sized + 'a> Unpin for &'a T {}
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<'a, T: ?Sized + 'a> Unpin for &'a mut T {} impl<'a, T: ?Sized + 'a> Unpin for &'a mut T {}
/// Implementations of `Copy` for primitive types. /// Implementations of `Copy` for primitive types.

View File

@ -273,7 +273,7 @@ impl<T> Option<T> {
/// Converts from `Pin<&Option<T>>` to `Option<Pin<&T>>` /// Converts from `Pin<&Option<T>>` to `Option<Pin<&T>>`
#[inline] #[inline]
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub fn as_pin_ref<'a>(self: Pin<&'a Option<T>>) -> Option<Pin<&'a T>> { pub fn as_pin_ref<'a>(self: Pin<&'a Option<T>>) -> Option<Pin<&'a T>> {
unsafe { unsafe {
Pin::get_ref(self).as_ref().map(|x| Pin::new_unchecked(x)) Pin::get_ref(self).as_ref().map(|x| Pin::new_unchecked(x))
@ -282,7 +282,7 @@ impl<T> Option<T> {
/// Converts from `Pin<&mut Option<T>>` to `Option<Pin<&mut T>>` /// Converts from `Pin<&mut Option<T>>` to `Option<Pin<&mut T>>`
#[inline] #[inline]
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub fn as_pin_mut<'a>(self: Pin<&'a mut Option<T>>) -> Option<Pin<&'a mut T>> { pub fn as_pin_mut<'a>(self: Pin<&'a mut Option<T>>) -> Option<Pin<&'a mut T>> {
unsafe { unsafe {
Pin::get_unchecked_mut(self).as_mut().map(|x| Pin::new_unchecked(x)) Pin::get_unchecked_mut(self).as_mut().map(|x| Pin::new_unchecked(x))

View File

@ -97,7 +97,7 @@
//! // std::mem::swap(&mut *still_unmoved, &mut *new_unmoved); //! // std::mem::swap(&mut *still_unmoved, &mut *new_unmoved);
//! ``` //! ```
#![unstable(feature = "pin", issue = "49150")] #![stable(feature = "pin", since = "1.33.0")]
use fmt; use fmt;
use marker::{Sized, Unpin}; use marker::{Sized, Unpin};
@ -116,7 +116,7 @@ use ops::{Deref, DerefMut, Receiver, CoerceUnsized, DispatchFromDyn};
// //
// Note: the derives below are allowed because they all only use `&P`, so they // Note: the derives below are allowed because they all only use `&P`, so they
// cannot move the value behind `pointer`. // cannot move the value behind `pointer`.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[fundamental] #[fundamental]
#[repr(transparent)] #[repr(transparent)]
#[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] #[derive(Copy, Clone, Hash, Eq, PartialEq, Ord, PartialOrd)]
@ -130,7 +130,7 @@ where
{ {
/// Construct a new `Pin` around a pointer to some data of a type that /// Construct a new `Pin` around a pointer to some data of a type that
/// implements `Unpin`. /// implements `Unpin`.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn new(pointer: P) -> Pin<P> { pub 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
@ -152,14 +152,14 @@ impl<P: Deref> Pin<P> {
/// ///
/// If `pointer` dereferences to an `Unpin` type, `Pin::new` should be used /// If `pointer` dereferences to an `Unpin` type, `Pin::new` should be used
/// instead. /// instead.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub unsafe fn new_unchecked(pointer: P) -> Pin<P> { pub unsafe fn new_unchecked(pointer: P) -> Pin<P> {
Pin { pointer } Pin { pointer }
} }
/// Get a pinned shared reference from this pinned pointer. /// Get a pinned shared reference from this pinned pointer.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn as_ref(self: &Pin<P>) -> Pin<&P::Target> { pub fn as_ref(self: &Pin<P>) -> Pin<&P::Target> {
unsafe { Pin::new_unchecked(&*self.pointer) } unsafe { Pin::new_unchecked(&*self.pointer) }
@ -168,14 +168,14 @@ impl<P: Deref> Pin<P> {
impl<P: DerefMut> Pin<P> { impl<P: DerefMut> Pin<P> {
/// Get a pinned mutable reference from this pinned pointer. /// Get a pinned mutable reference from this pinned pointer.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn as_mut(self: &mut Pin<P>) -> Pin<&mut P::Target> { pub fn as_mut(self: &mut Pin<P>) -> Pin<&mut P::Target> {
unsafe { Pin::new_unchecked(&mut *self.pointer) } unsafe { Pin::new_unchecked(&mut *self.pointer) }
} }
/// Assign a new value to the memory behind the pinned reference. /// Assign a new value to the memory behind the pinned reference.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn set(mut self: Pin<P>, value: P::Target) pub fn set(mut self: Pin<P>, value: P::Target)
where where
@ -197,7 +197,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
/// will not move so long as the argument value does not move (for example, /// will not move so long as the argument value does not move (for example,
/// because it is one of the fields of that value), and also that you do /// because it is one of the fields of that value), and also that you do
/// not move out of the argument you receive to the interior function. /// not move out of the argument you receive to the interior function.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub unsafe fn map_unchecked<U, F>(self: Pin<&'a T>, func: F) -> Pin<&'a U> where pub unsafe fn map_unchecked<U, F>(self: Pin<&'a T>, func: F) -> Pin<&'a U> where
F: FnOnce(&T) -> &U, F: FnOnce(&T) -> &U,
{ {
@ -213,7 +213,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
/// that lives for as long as the borrow of the `Pin`, not the lifetime of /// that lives for as long as the borrow of the `Pin`, not the lifetime of
/// the `Pin` itself. This method allows turning the `Pin` into a reference /// the `Pin` itself. This method allows turning the `Pin` into a reference
/// with the same lifetime as the original `Pin`. /// with the same lifetime as the original `Pin`.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn get_ref(self: Pin<&'a T>) -> &'a T { pub fn get_ref(self: Pin<&'a T>) -> &'a T {
self.pointer self.pointer
@ -222,7 +222,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
impl<'a, T: ?Sized> Pin<&'a mut T> { impl<'a, T: ?Sized> Pin<&'a mut T> {
/// Convert this `Pin<&mut T>` into a `Pin<&T>` with the same lifetime. /// Convert this `Pin<&mut T>` into a `Pin<&T>` with the same lifetime.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn into_ref(self: Pin<&'a mut T>) -> Pin<&'a T> { pub fn into_ref(self: Pin<&'a mut T>) -> Pin<&'a T> {
Pin { pointer: self.pointer } Pin { pointer: self.pointer }
@ -237,7 +237,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
/// that lives for as long as the borrow of the `Pin`, not the lifetime of /// that lives for as long as the borrow of the `Pin`, not the lifetime of
/// the `Pin` itself. This method allows turning the `Pin` into a reference /// the `Pin` itself. This method allows turning the `Pin` into a reference
/// with the same lifetime as the original `Pin`. /// with the same lifetime as the original `Pin`.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub fn get_mut(self: Pin<&'a mut T>) -> &'a mut T pub fn get_mut(self: Pin<&'a mut T>) -> &'a mut T
where T: Unpin, where T: Unpin,
@ -255,7 +255,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
/// ///
/// If the underlying data is `Unpin`, `Pin::get_mut` should be used /// If the underlying data is `Unpin`, `Pin::get_mut` should be used
/// instead. /// instead.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
#[inline(always)] #[inline(always)]
pub unsafe fn get_unchecked_mut(self: Pin<&'a mut T>) -> &'a mut T { pub unsafe fn get_unchecked_mut(self: Pin<&'a mut T>) -> &'a mut T {
self.pointer self.pointer
@ -272,7 +272,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
/// will not move so long as the argument value does not move (for example, /// will not move so long as the argument value does not move (for example,
/// because it is one of the fields of that value), and also that you do /// because it is one of the fields of that value), and also that you do
/// not move out of the argument you receive to the interior function. /// not move out of the argument you receive to the interior function.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub unsafe fn map_unchecked_mut<U, F>(self: Pin<&'a mut T>, func: F) -> Pin<&'a mut U> where pub unsafe fn map_unchecked_mut<U, F>(self: Pin<&'a mut T>, func: F) -> Pin<&'a mut U> where
F: FnOnce(&mut T) -> &mut U, F: FnOnce(&mut T) -> &mut U,
{ {
@ -282,7 +282,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<P: Deref> Deref for Pin<P> { impl<P: Deref> Deref for Pin<P> {
type Target = P::Target; type Target = P::Target;
fn deref(&self) -> &P::Target { fn deref(&self) -> &P::Target {
@ -290,7 +290,7 @@ impl<P: Deref> Deref for Pin<P> {
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<P: DerefMut> DerefMut for Pin<P> impl<P: DerefMut> DerefMut for Pin<P>
where where
P::Target: Unpin P::Target: Unpin
@ -303,21 +303,21 @@ where
#[unstable(feature = "receiver_trait", issue = "0")] #[unstable(feature = "receiver_trait", issue = "0")]
impl<P: Receiver> Receiver for Pin<P> {} impl<P: Receiver> Receiver for Pin<P> {}
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<P: fmt::Debug> fmt::Debug for Pin<P> { impl<P: fmt::Debug> fmt::Debug for Pin<P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Debug::fmt(&self.pointer, f) fmt::Debug::fmt(&self.pointer, f)
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<P: fmt::Display> fmt::Display for Pin<P> { impl<P: fmt::Display> fmt::Display for Pin<P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Display::fmt(&self.pointer, f) fmt::Display::fmt(&self.pointer, f)
} }
} }
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<P: fmt::Pointer> fmt::Pointer for Pin<P> { impl<P: fmt::Pointer> fmt::Pointer for Pin<P> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
fmt::Pointer::fmt(&self.pointer, f) fmt::Pointer::fmt(&self.pointer, f)
@ -329,13 +329,13 @@ impl<P: fmt::Pointer> fmt::Pointer for Pin<P> {
// `Deref<Target=Unpin>` is unsound. Any such impl would probably be unsound // `Deref<Target=Unpin>` is unsound. Any such impl would probably be unsound
// for other reasons, though, so we just need to take care not to allow such // for other reasons, though, so we just need to take care not to allow such
// impls to land in std. // impls to land in std.
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<P, U> CoerceUnsized<Pin<U>> for Pin<P> impl<P, U> CoerceUnsized<Pin<U>> for Pin<P>
where where
P: CoerceUnsized<U>, P: CoerceUnsized<U>,
{} {}
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
impl<'a, P, U> DispatchFromDyn<Pin<U>> for Pin<P> impl<'a, P, U> DispatchFromDyn<Pin<U>> for Pin<P>
where where
P: DispatchFromDyn<U>, P: DispatchFromDyn<U>,

View File

@ -281,7 +281,6 @@
#![feature(optin_builtin_traits)] #![feature(optin_builtin_traits)]
#![feature(panic_internals)] #![feature(panic_internals)]
#![feature(panic_unwind)] #![feature(panic_unwind)]
#![feature(pin)]
#![feature(prelude_import)] #![feature(prelude_import)]
#![feature(ptr_internals)] #![feature(ptr_internals)]
#![feature(raw)] #![feature(raw)]
@ -433,7 +432,7 @@ pub use alloc_crate::borrow;
pub use alloc_crate::fmt; pub use alloc_crate::fmt;
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub use alloc_crate::format; pub use alloc_crate::format;
#[unstable(feature = "pin", issue = "49150")] #[stable(feature = "pin", since = "1.33.0")]
pub use core::pin; pub use core::pin;
#[stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")]
pub use alloc_crate::slice; pub use alloc_crate::slice;

View File

@ -1,5 +1,5 @@
#![deny(unused_must_use)] #![deny(unused_must_use)]
#![feature(futures_api, pin, arbitrary_self_types)] #![feature(arbitrary_self_types, futures_api)]
use std::iter::Iterator; use std::iter::Iterator;
use std::future::Future; use std::future::Future;

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(pin)] #![feature(arbitrary_self_types)]
#![feature(rustc_attrs)] #![feature(rustc_attrs)]
use std::{ use std::{

View File

@ -10,7 +10,7 @@
// edition:2018 // edition:2018
#![feature(arbitrary_self_types, async_await, await_macro, futures_api, pin)] #![feature(arbitrary_self_types, async_await, await_macro, futures_api)]
use std::pin::Pin; use std::pin::Pin;
use std::future::Future; use std::future::Future;

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed // option. This file may not be copied, modified, or distributed
// except according to those terms. // except according to those terms.
#![feature(arbitrary_self_types, futures_api, pin)] #![feature(arbitrary_self_types, futures_api)]
#![allow(unused)] #![allow(unused)]
use std::future::Future; use std::future::Future;