From ee51a3c10aa26b6e6c4e86622181d4a3d396fb34 Mon Sep 17 00:00:00 2001 From: Taylor Cramer Date: Fri, 22 Jun 2018 11:36:01 -0700 Subject: [PATCH] Review nits and updates Move future_from_generator out of raw Update await to use $crate Renumber errors --- src/librustc/diagnostics.rs | 6 ++-- src/librustc/hir/lowering.rs | 15 ++++---- src/libstd/{raw.rs => future.rs} | 28 +++++++-------- src/libstd/lib.rs | 35 ++++++++++--------- src/libstd/macros.rs | 10 +++--- .../ui/async-fn-multiple-lifetimes.stderr | 6 ++-- .../ui/no-args-non-move-async-closure.stderr | 4 +-- 7 files changed, 51 insertions(+), 53 deletions(-) rename src/libstd/{raw.rs => future.rs} (82%) diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index 6e6b15bdff744..09153c144ae80 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -2134,7 +2134,7 @@ register_diagnostics! { E0906, // closures cannot be static - E0703, // multiple different lifetimes used in arguments of `async fn` - E0704, // multiple elided lifetimes used in arguments of `async fn` - E0705, // `async` non-`move` closures with arguments are not currently supported + E0725, // multiple different lifetimes used in arguments of `async fn` + E0726, // multiple elided lifetimes used in arguments of `async fn` + E0727, // `async` non-`move` closures with arguments are not currently supported } diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index ad8da5a4350bb..aeef93a174029 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -877,7 +877,7 @@ impl<'a> LoweringContext<'a> { let unstable_span = self.allow_internal_unstable(CompilerDesugaringKind::Async, span); let gen_future = self.expr_std_path( - unstable_span, &["raw", "future_from_generator"], None, ThinVec::new()); + unstable_span, &["future", "future_from_generator"], None, ThinVec::new()); hir::ExprCall(P(gen_future), hir_vec![generator]) } @@ -2049,7 +2049,7 @@ impl<'a> LoweringContext<'a> { struct_span_err!( self.context.sess, current_lt_span.between(lifetime.span), - E0703, + E0725, "multiple different lifetimes used in arguments of `async fn`", ) .span_label(current_lt_span, "first lifetime here") @@ -2061,7 +2061,7 @@ impl<'a> LoweringContext<'a> { struct_span_err!( self.context.sess, current_lt_span.between(lifetime.span), - E0704, + E0726, "multiple elided lifetimes used in arguments of `async fn`", ) .span_label(current_lt_span, "first lifetime here") @@ -2582,9 +2582,10 @@ impl<'a> LoweringContext<'a> { let fn_def_id = self.resolver.definitions().local_def_id(id); self.with_new_scopes(|this| { - // Note: we can use non-async decl here because lower_body - // only cares about the input argument patterns, - // not the return types. + // Note: we don't need to change the return type from `T` to + // `impl Future` here because lower_body + // only cares about the input argument patterns in the function + // declaration (decl), not the return types. let body_id = this.lower_body(Some(decl), |this| { if let IsAsync::Async(async_node_id) = header.asyncness { let async_expr = this.make_async_expr( @@ -3560,7 +3561,7 @@ impl<'a> LoweringContext<'a> { struct_span_err!( this.sess, fn_decl_span, - E0705, + E0727, "`async` non-`move` closures with arguments \ are not currently supported", ) diff --git a/src/libstd/raw.rs b/src/libstd/future.rs similarity index 82% rename from src/libstd/raw.rs rename to src/libstd/future.rs index 62fd42c4de7af..abacb8626566d 100644 --- a/src/libstd/raw.rs +++ b/src/libstd/future.rs @@ -1,4 +1,4 @@ -// Copyright 2013 The Rust Project Developers. See the COPYRIGHT +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -8,18 +8,9 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -#![allow(missing_docs)] -#![unstable(feature = "raw", issue = "27751")] - -//! Contains struct definitions for the layout of compiler built-in types. -//! -//! They can be used as targets of transmutes in unsafe code for manipulating -//! the raw representations directly. -//! -//! Their definition should always match the ABI defined in `rustc::back::abi`. +//! Asynchronous values. use core::cell::Cell; -use core::future::Future; use core::marker::Unpin; use core::mem::PinMut; use core::option::Option; @@ -27,8 +18,8 @@ use core::ptr::NonNull; use core::task::{self, Poll}; use core::ops::{Drop, Generator, GeneratorState}; -#[stable(feature = "rust1", since = "1.0.0")] -pub use core::raw::*; +#[doc(inline)] +pub use core::future::*; /// Wrap a future in a generator. /// @@ -52,7 +43,7 @@ impl> !Unpin for GenFuture {} impl> Future for GenFuture { type Output = T::Return; fn poll(self: PinMut, cx: &mut task::Context) -> Poll { - with_set_cx(cx, || match unsafe { PinMut::get_mut(self).0.resume() } { + set_task_cx(cx, || match unsafe { PinMut::get_mut(self).0.resume() } { GeneratorState::Yielded(()) => Poll::Pending, GeneratorState::Complete(x) => Poll::Ready(x), }) @@ -74,7 +65,8 @@ impl Drop for SetOnDrop { } #[unstable(feature = "gen_future", issue = "50547")] -pub fn with_set_cx(cx: &mut task::Context, f: F) -> R +/// Sets the thread-local task context used by async/await futures. +pub fn set_task_cx(cx: &mut task::Context, f: F) -> R where F: FnOnce() -> R { @@ -90,7 +82,11 @@ where } #[unstable(feature = "gen_future", issue = "50547")] -pub fn with_get_cx(f: F) -> R +/// Retrieves the thread-local task context used by async/await futures. +/// +/// Panics if no task has been set or if the task context has already been +/// retrived by a surrounding call to get_task_cx. +pub fn get_task_cx(f: F) -> R where F: FnOnce(&mut task::Context) -> R { diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index c74cd3feca341..caad924ea5b5f 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -411,6 +411,8 @@ pub use core::ops; #[stable(feature = "rust1", since = "1.0.0")] pub use core::ptr; #[stable(feature = "rust1", since = "1.0.0")] +pub use core::raw; +#[stable(feature = "rust1", since = "1.0.0")] pub use core::result; #[stable(feature = "rust1", since = "1.0.0")] pub use core::option; @@ -461,22 +463,6 @@ pub use core::u128; #[stable(feature = "core_hint", since = "1.27.0")] pub use core::hint; -#[unstable(feature = "futures_api", - reason = "futures in libcore are unstable", - issue = "50547")] -pub mod task { - //! Types and Traits for working with asynchronous tasks. - #[doc(inline)] - pub use core::task::*; - #[doc(inline)] - pub use alloc_crate::task::*; -} - -#[unstable(feature = "futures_api", - reason = "futures in libcore are unstable", - issue = "50547")] -pub use core::future; - pub mod f32; pub mod f64; @@ -495,10 +481,25 @@ pub mod os; pub mod panic; pub mod path; pub mod process; -pub mod raw; pub mod sync; pub mod time; +#[unstable(feature = "futures_api", + reason = "futures in libcore are unstable", + issue = "50547")] +pub mod task { + //! Types and Traits for working with asynchronous tasks. + #[doc(inline)] + pub use core::task::*; + #[doc(inline)] + pub use alloc_crate::task::*; +} + +#[unstable(feature = "futures_api", + reason = "futures in libcore are unstable", + issue = "50547")] +pub mod future; + // Platform-abstraction modules #[macro_use] mod sys_common; diff --git a/src/libstd/macros.rs b/src/libstd/macros.rs index 1f2a6e2bfea16..1e9da42d40d9e 100644 --- a/src/libstd/macros.rs +++ b/src/libstd/macros.rs @@ -220,15 +220,15 @@ macro_rules! eprintln { macro_rules! await { ($e:expr) => { { let mut pinned = $e; - let mut pinned = unsafe { ::core::mem::PinMut::new_unchecked(&mut pinned) }; + let mut pinned = unsafe { $crate::mem::PinMut::new_unchecked(&mut pinned) }; loop { - match ::std::raw::with_get_cx(|cx| - ::core::future::Future::poll(pinned.reborrow(), cx)) + match $crate::future::get_task_cx(|cx| + $crate::future::Future::poll(pinned.reborrow(), cx)) { // FIXME(cramertj) prior to stabilizing await, we have to ensure that this // can't be used to create a generator on stable via `|| await!()`. - ::core::task::Poll::Pending => yield, - ::core::task::Poll::Ready(x) => break x, + $crate::task::Poll::Pending => yield, + $crate::task::Poll::Ready(x) => break x, } } } } diff --git a/src/test/ui/async-fn-multiple-lifetimes.stderr b/src/test/ui/async-fn-multiple-lifetimes.stderr index 085b9499a416b..d76bfc5d0e1ab 100644 --- a/src/test/ui/async-fn-multiple-lifetimes.stderr +++ b/src/test/ui/async-fn-multiple-lifetimes.stderr @@ -1,4 +1,4 @@ -error[E0703]: multiple different lifetimes used in arguments of `async fn` +error[E0725]: multiple different lifetimes used in arguments of `async fn` --> $DIR/async-fn-multiple-lifetimes.rs:17:49 | LL | async fn multiple_named_lifetimes<'a, 'b>(_: &'a u8, _: &'b u8) {} @@ -8,7 +8,7 @@ LL | async fn multiple_named_lifetimes<'a, 'b>(_: &'a u8, _: &'b u8) {} | = help: `async fn` can only accept borrowed values with identical lifetimes -error[E0704]: multiple elided lifetimes used in arguments of `async fn` +error[E0726]: multiple elided lifetimes used in arguments of `async fn` --> $DIR/async-fn-multiple-lifetimes.rs:26:39 | LL | async fn multiple_elided_lifetimes(_: &u8, _: &u8) {} @@ -28,5 +28,5 @@ LL | async fn multiple_elided_lifetimes(_: &u8, _: &u8) {} error: aborting due to 3 previous errors -Some errors occurred: E0106, E0703, E0704. +Some errors occurred: E0106, E0725, E0726. For more information about an error, try `rustc --explain E0106`. diff --git a/src/test/ui/no-args-non-move-async-closure.stderr b/src/test/ui/no-args-non-move-async-closure.stderr index 1e49cb2e93c05..34cd0069c041d 100644 --- a/src/test/ui/no-args-non-move-async-closure.stderr +++ b/src/test/ui/no-args-non-move-async-closure.stderr @@ -1,4 +1,4 @@ -error[E0705]: `async` non-`move` closures with arguments are not currently supported +error[E0727]: `async` non-`move` closures with arguments are not currently supported --> $DIR/no-args-non-move-async-closure.rs:16:13 | LL | let _ = async |x: u8| {}; @@ -8,4 +8,4 @@ LL | let _ = async |x: u8| {}; error: aborting due to previous error -For more information about this error, try `rustc --explain E0705`. +For more information about this error, try `rustc --explain E0727`.