Skip to content

Commit

Permalink
Rollup merge of rust-lang#74328 - yoshuawuyts:stabilize-future-readin…
Browse files Browse the repository at this point in the history
…ess-fns, r=sfackler

Stabilize core::future::{pending,ready}

This PR stabilizes `core::future::{pending,ready}`, tracking issue rust-lang#70921.

## Motivation

These functions have been on nightly for three months now, and have lived as part of the futures ecosystem for several years. In that time these functions have undergone several iterations, with [the `async-std` impls](https://docs.rs/async-std/1.6.2/async_std/future/index.html) probably diverging the most (using `async fn`, which in hindsight was a mistake).

It seems the space around these functions has been _thoroughly_ explored over the last couple of years, and the ecosystem has settled on the current shape of the functions. It seems highly unlikely we'd want to make any further changes to these functions, so I propose we stabilize.

## Implementation notes

This stabilization PR was fairly straightforward; this feature has already thoroughly been reviewed by the libs team already in rust-lang#70834. So all this PR does is remove the feature gate.
  • Loading branch information
Dylan-DPC committed Sep 12, 2020
2 parents 9911160 + 688f447 commit e7f5a4d
Show file tree
Hide file tree
Showing 6 changed files with 24 additions and 18 deletions.
4 changes: 2 additions & 2 deletions library/core/src/future/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ pub use self::future::Future;
#[unstable(feature = "into_future", issue = "67644")]
pub use into_future::IntoFuture;

#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
pub use pending::{pending, Pending};
#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
pub use ready::{ready, Ready};

#[unstable(feature = "future_poll_fn", issue = "72302")]
Expand Down
20 changes: 13 additions & 7 deletions library/core/src/future/pending.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use crate::fmt::{self, Debug};
use crate::future::Future;
use crate::marker;
use crate::pin::Pin;
Expand All @@ -10,8 +11,7 @@ use crate::task::{Context, Poll};
/// documentation for more.
///
/// [`pending`]: fn.pending.html
#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[derive(Debug)]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
#[must_use = "futures do nothing unless you `.await` or poll them"]
pub struct Pending<T> {
_data: marker::PhantomData<T>,
Expand All @@ -23,7 +23,6 @@ pub struct Pending<T> {
/// # Examples
///
/// ```no_run
/// #![feature(future_readiness_fns)]
/// use core::future;
///
/// # async fn run() {
Expand All @@ -32,12 +31,12 @@ pub struct Pending<T> {
/// unreachable!();
/// # }
/// ```
#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
pub fn pending<T>() -> Pending<T> {
Pending { _data: marker::PhantomData }
}

#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
impl<T> Future for Pending<T> {
type Output = T;

Expand All @@ -46,10 +45,17 @@ impl<T> Future for Pending<T> {
}
}

#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
impl<T> Unpin for Pending<T> {}

#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
impl<T> Debug for Pending<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Pending").finish()
}
}

#[stable(feature = "future_readiness_fns", since = "1.47.0")]
impl<T> Clone for Pending<T> {
fn clone(&self) -> Self {
pending()
Expand Down
13 changes: 8 additions & 5 deletions library/core/src/future/ready.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ use crate::task::{Context, Poll};
/// documentation for more.
///
/// [`ready`]: fn.ready.html
#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
#[derive(Debug, Clone)]
#[must_use = "futures do nothing unless you `.await` or poll them"]
pub struct Ready<T>(Option<T>);

#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
impl<T> Unpin for Ready<T> {}

#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
impl<T> Future for Ready<T> {
type Output = T;

Expand All @@ -28,18 +28,21 @@ impl<T> Future for Ready<T> {

/// Creates a future that is immediately ready with a value.
///
/// Futures created through this function are functionally similar to those
/// created through `async {}`. The main difference is that futures created
/// through this function are named and implement `Unpin`.
///
/// # Examples
///
/// ```
/// #![feature(future_readiness_fns)]
/// use core::future;
///
/// # async fn run() {
/// let a = future::ready(1);
/// assert_eq!(a.await, 1);
/// # }
/// ```
#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
pub fn ready<T>(t: T) -> Ready<T> {
Ready(Some(t))
}
2 changes: 0 additions & 2 deletions library/core/src/task/ready.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
/// # Examples
///
/// ```
/// #![feature(future_readiness_fns)]
/// #![feature(ready_macro)]
///
/// use core::task::{ready, Context, Poll};
Expand All @@ -27,7 +26,6 @@
/// The `ready!` call expands to:
///
/// ```
/// # #![feature(future_readiness_fns)]
/// # #![feature(ready_macro)]
/// #
/// # use core::task::{Context, Poll};
Expand Down
2 changes: 1 addition & 1 deletion library/std/src/future.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ pub use core::future::Future;
pub use core::future::{from_generator, get_context, ResumeTy};

#[doc(inline)]
#[unstable(feature = "future_readiness_fns", issue = "70921")]
#[stable(feature = "future_readiness_fns", since = "1.47.0")]
pub use core::future::{pending, ready, Pending, Ready};

#[doc(inline)]
Expand Down
1 change: 0 additions & 1 deletion library/std/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,6 @@
#![feature(external_doc)]
#![feature(fn_traits)]
#![feature(format_args_nl)]
#![feature(future_readiness_fns)]
#![feature(gen_future)]
#![feature(generator_trait)]
#![feature(global_asm)]
Expand Down

0 comments on commit e7f5a4d

Please sign in to comment.