Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rollup of 9 pull requests #89791

Merged
merged 25 commits into from
Oct 12, 2021
Merged
Changes from 5 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a57c18b
add `Poll::ready`
ibraheemdev Oct 7, 2021
a3f98a7
Fix inherent impl overlap check.
cjgillot Oct 7, 2021
5f7e7d2
revert stabilization of `core::task::ready!`
ibraheemdev Oct 7, 2021
597090e
Re-use TypeChecker instead of passing around some of its fields
oli-obk Sep 30, 2021
49b06a2
Directly call relate_types function instead of having a method wrapper
oli-obk Oct 8, 2021
a94e39e
Add long explanation for error E0482
sireliah Oct 9, 2021
14aae67
Allow the E0482 to be tested
sireliah Oct 9, 2021
7f974d0
Greatly reduce amount of debuginfo compiled for bootstrap itself
jyn514 Oct 11, 2021
1b283d4
Remove hack ignoring unused attributes for stage 0 std
jyn514 Oct 11, 2021
6531cd8
Fix function-names test for GDB 10.1
michaelwoerister Oct 11, 2021
de940fc
Use Ancestory to check default fn in const impl instead of comparing …
nbdd0121 Oct 2, 2021
0a03f8c
Split impl-with-default-fn test into a pass test and a fail test
nbdd0121 Oct 11, 2021
7a7dfa8
Remove task::ready! from 1.56.0 release notes
dtolnay Oct 11, 2021
a1e03fc
Add library tracking issue for poll_ready feature
dtolnay Oct 11, 2021
0fde6f6
Clarify the error descriptions
sireliah Oct 10, 2021
148f456
Fix ICE 89775
nbdd0121 Oct 11, 2021
412301b
Rollup merge of #89471 - nbdd0121:const3, r=fee1-dead
matthiaskrgr Oct 11, 2021
b80dd9e
Rollup merge of #89643 - cjgillot:overlap, r=matthewjasper
matthiaskrgr Oct 11, 2021
d3984e1
Rollup merge of #89651 - ibraheemdev:poll-ready, r=dtolnay
matthiaskrgr Oct 11, 2021
fde2412
Rollup merge of #89675 - oli-obk:type_checker, r=davidtwco
matthiaskrgr Oct 11, 2021
57504aa
Rollup merge of #89710 - sireliah:e0482, r=GuillaumeGomez
matthiaskrgr Oct 11, 2021
1be64f3
Rollup merge of #89756 - jyn514:bootstrap-times, r=Mark-Simulacrum
matthiaskrgr Oct 11, 2021
b9311b4
Rollup merge of #89760 - jyn514:remove-incremental-hack, r=Mark-Simul…
matthiaskrgr Oct 11, 2021
603da7e
Rollup merge of #89772 - michaelwoerister:fix-function-names-test-gdb…
matthiaskrgr Oct 11, 2021
f94a325
Rollup merge of #89785 - nbdd0121:master, r=Mark-Simulacrum
matthiaskrgr Oct 11, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions RELEASES.md
Original file line number Diff line number Diff line change
@@ -64,7 +64,6 @@ Stabilised APIs
- [`VecDeque::shrink_to`]
- [`HashMap::shrink_to`]
- [`HashSet::shrink_to`]
- [`task::ready!`]

These APIs are now usable in const contexts:

@@ -128,7 +127,6 @@ and related tools.
[`VecDeque::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/struct.VecDeque.html#method.shrink_to
[`HashMap::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_map/struct.HashMap.html#method.shrink_to
[`HashSet::shrink_to`]: https://doc.rust-lang.org/stable/std/collections/hash_set/struct.HashSet.html#method.shrink_to
[`task::ready!`]: https://doc.rust-lang.org/stable/std/task/macro.ready.html
[`std::mem::transmute`]: https://doc.rust-lang.org/stable/std/mem/fn.transmute.html
[`slice::first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.first
[`slice::split_first`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.split_first
4 changes: 3 additions & 1 deletion library/core/src/task/mod.rs
Original file line number Diff line number Diff line change
@@ -11,5 +11,7 @@ mod wake;
pub use self::wake::{Context, RawWaker, RawWakerVTable, Waker};

mod ready;
#[stable(feature = "ready_macro", since = "1.56.0")]
#[unstable(feature = "ready_macro", issue = "70922")]
pub use ready::ready;
#[unstable(feature = "poll_ready", issue = "89780")]
pub use ready::Ready;
33 changes: 33 additions & 0 deletions library/core/src/task/poll.rs
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
use crate::convert;
use crate::ops::{self, ControlFlow};
use crate::result::Result;
use crate::task::Ready;

/// Indicates whether a value is available or if the current task has been
/// scheduled to receive a wakeup instead.
@@ -92,6 +93,38 @@ impl<T> Poll<T> {
pub const fn is_pending(&self) -> bool {
!self.is_ready()
}

/// Extracts the successful type of a [`Poll<T>`].
///
/// When combined with the `?` operator, this function will
/// propogate any [`Poll::Pending`] values to the caller, and
/// extract the `T` from [`Poll::Ready`].
///
/// # Examples
///
/// ```rust
/// #![feature(poll_ready)]
///
/// use std::task::{Context, Poll};
/// use std::future::{self, Future};
/// use std::pin::Pin;
///
/// pub fn do_poll(cx: &mut Context<'_>) -> Poll<()> {
/// let mut fut = future::ready(42);
/// let fut = Pin::new(&mut fut);
///
/// let num = fut.poll(cx).ready()?;
/// # drop(num);
/// // ... use num
///
/// Poll::Ready(())
/// }
/// ```
#[inline]
#[unstable(feature = "poll_ready", issue = "89780")]
pub fn ready(self) -> Ready<T> {
Ready(self)
}
}

impl<T, E> Poll<Result<T, E>> {
62 changes: 61 additions & 1 deletion library/core/src/task/ready.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
use core::convert;
use core::fmt;
use core::ops::{ControlFlow, FromResidual, Try};
use core::task::Poll;

/// Extracts the successful type of a [`Poll<T>`].
///
/// This macro bakes in propagation of [`Pending`] signals by returning early.
@@ -8,6 +13,8 @@
/// # Examples
///
/// ```
/// #![feature(ready_macro)]
///
/// use std::task::{ready, Context, Poll};
/// use std::future::{self, Future};
/// use std::pin::Pin;
@@ -27,6 +34,7 @@
/// The `ready!` call expands to:
///
/// ```
/// # #![feature(ready_macro)]
/// # use std::task::{Context, Poll};
/// # use std::future::{self, Future};
/// # use std::pin::Pin;
@@ -45,7 +53,7 @@
/// # Poll::Ready(())
/// # }
/// ```
#[stable(feature = "ready_macro", since = "1.56.0")]
#[unstable(feature = "ready_macro", issue = "70922")]
#[rustc_macro_transparency = "semitransparent"]
pub macro ready($e:expr) {
match $e {
@@ -55,3 +63,55 @@ pub macro ready($e:expr) {
}
}
}

/// Extracts the successful type of a [`Poll<T>`].
///
/// See [`Poll::ready`] for details.
#[unstable(feature = "poll_ready", issue = "89780")]
pub struct Ready<T>(pub(crate) Poll<T>);

#[unstable(feature = "poll_ready", issue = "89780")]
impl<T> Try for Ready<T> {
type Output = T;
type Residual = Ready<convert::Infallible>;

#[inline]
fn from_output(output: Self::Output) -> Self {
Ready(Poll::Ready(output))
}

#[inline]
fn branch(self) -> ControlFlow<Self::Residual, Self::Output> {
match self.0 {
Poll::Ready(v) => ControlFlow::Continue(v),
Poll::Pending => ControlFlow::Break(Ready(Poll::Pending)),
}
}
}

#[unstable(feature = "poll_ready", issue = "89780")]
impl<T> FromResidual for Ready<T> {
#[inline]
fn from_residual(residual: Ready<convert::Infallible>) -> Self {
match residual.0 {
Poll::Pending => Ready(Poll::Pending),
}
}
}

#[unstable(feature = "poll_ready", issue = "89780")]
impl<T> FromResidual<Ready<convert::Infallible>> for Poll<T> {
#[inline]
fn from_residual(residual: Ready<convert::Infallible>) -> Self {
match residual.0 {
Poll::Pending => Poll::Pending,
}
}
}

#[unstable(feature = "poll_ready", issue = "89780")]
impl<T> fmt::Debug for Ready<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("Ready").finish()
}
}