Skip to content

Commit

Permalink
Adjust tests wrt. 'async_closure' feature gate.
Browse files Browse the repository at this point in the history
  • Loading branch information
Centril committed Jul 3, 2019
1 parent bb7fbb9 commit 43315bc
Show file tree
Hide file tree
Showing 20 changed files with 206 additions and 76 deletions.
8 changes: 0 additions & 8 deletions src/test/ui/async-await/async-await.rs
Expand Up @@ -70,13 +70,6 @@ fn async_nonmove_block(x: u8) -> impl Future<Output = u8> {
}
}

fn async_closure(x: u8) -> impl Future<Output = u8> {
(async move |x: u8| -> u8 {
wake_and_yield_once().await;
x
})(x)
}

async fn async_fn(x: u8) -> u8 {
wake_and_yield_once().await;
x
Expand Down Expand Up @@ -180,7 +173,6 @@ fn main() {
test! {
async_block,
async_nonmove_block,
async_closure,
async_fn,
generic_async_fn,
async_fn_with_internal_borrow,
Expand Down
12 changes: 12 additions & 0 deletions src/test/ui/async-await/async-closure-matches-expr.rs
@@ -0,0 +1,12 @@
// compile-pass
// edition:2018

#![feature(async_await, async_closure)]

macro_rules! match_expr {
($x:expr) => {}
}

fn main() {
match_expr!(async || {});
}
81 changes: 81 additions & 0 deletions src/test/ui/async-await/async-closure.rs
@@ -0,0 +1,81 @@
// run-pass

// edition:2018
// aux-build:arc_wake.rs

#![feature(async_await, async_closure)]

extern crate arc_wake;

use std::pin::Pin;
use std::future::Future;
use std::sync::{
Arc,
atomic::{self, AtomicUsize},
};
use std::task::{Context, Poll};
use arc_wake::ArcWake;

struct Counter {
wakes: AtomicUsize,
}

impl ArcWake for Counter {
fn wake(self: Arc<Self>) {
Self::wake_by_ref(&self)
}
fn wake_by_ref(arc_self: &Arc<Self>) {
arc_self.wakes.fetch_add(1, atomic::Ordering::SeqCst);
}
}

struct WakeOnceThenComplete(bool);

fn wake_and_yield_once() -> WakeOnceThenComplete { WakeOnceThenComplete(false) }

impl Future for WakeOnceThenComplete {
type Output = ();
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
if self.0 {
Poll::Ready(())
} else {
cx.waker().wake_by_ref();
self.0 = true;
Poll::Pending
}
}
}

fn async_closure(x: u8) -> impl Future<Output = u8> {
(async move |x: u8| -> u8 {
wake_and_yield_once().await;
x
})(x)
}

fn test_future_yields_once_then_returns<F, Fut>(f: F)
where
F: FnOnce(u8) -> Fut,
Fut: Future<Output = u8>,
{
let mut fut = Box::pin(f(9));
let counter = Arc::new(Counter { wakes: AtomicUsize::new(0) });
let waker = ArcWake::into_waker(counter.clone());
let mut cx = Context::from_waker(&waker);
assert_eq!(0, counter.wakes.load(atomic::Ordering::SeqCst));
assert_eq!(Poll::Pending, fut.as_mut().poll(&mut cx));
assert_eq!(1, counter.wakes.load(atomic::Ordering::SeqCst));
assert_eq!(Poll::Ready(9), fut.as_mut().poll(&mut cx));
}

fn main() {
macro_rules! test {
($($fn_name:expr,)*) => { $(
test_future_yields_once_then_returns($fn_name);
)* }
}

test! {
async_closure,
}
}
3 changes: 1 addition & 2 deletions src/test/ui/async-await/async-matches-expr.rs
@@ -1,13 +1,12 @@
// compile-pass
// edition:2018

#![feature(async_await, await_macro)]
#![feature(async_await)]

macro_rules! match_expr {
($x:expr) => {}
}

fn main() {
match_expr!(async {});
match_expr!(async || {});
}
2 changes: 1 addition & 1 deletion src/test/ui/async-await/await-macro.rs
Expand Up @@ -3,7 +3,7 @@
// edition:2018
// aux-build:arc_wake.rs

#![feature(async_await, await_macro)]
#![feature(async_await, async_closure, await_macro)]

extern crate arc_wake;

Expand Down
8 changes: 8 additions & 0 deletions src/test/ui/async-await/feature-async-closure.rs
@@ -0,0 +1,8 @@
// edition:2018
// gate-test-async_closure

fn f() {
let _ = async || {}; //~ ERROR async closures are unstable
}

fn main() {}
12 changes: 12 additions & 0 deletions src/test/ui/async-await/feature-async-closure.stderr
@@ -0,0 +1,12 @@
error[E0658]: async closures are unstable
--> $DIR/feature-async-closure.rs:5:13
|
LL | let _ = async || {};
| ^^^^^
|
= note: for more information, see https://github.com/rust-lang/rust/issues/62290
= help: add #![feature(async_closure)] to the crate attributes to enable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0658`.
Expand Up @@ -11,8 +11,6 @@ fn main() {
//~^ ERROR `await` is only allowed inside `async` functions and blocks
let task1 = print_dur().await;
}.await;
(async || 2333)().await;
//~^ ERROR `await` is only allowed inside `async` functions and blocks
(|_| 2333).await;
//~^ ERROR `await` is only allowed inside `async` functions and blocks
//~^^ ERROR
Expand Down
@@ -1,13 +1,13 @@
error[E0728]: `await` is only allowed inside `async` functions and blocks
--> $DIR/issue-62009.rs:8:5
--> $DIR/issue-62009-1.rs:8:5
|
LL | fn main() {
| ---- this is not `async`
LL | async { let (); }.await;
| ^^^^^^^^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks

error[E0728]: `await` is only allowed inside `async` functions and blocks
--> $DIR/issue-62009.rs:10:5
--> $DIR/issue-62009-1.rs:10:5
|
LL | fn main() {
| ---- this is not `async`
Expand All @@ -19,31 +19,22 @@ LL | | }.await;
| |___________^ only allowed inside `async` functions and blocks

error[E0728]: `await` is only allowed inside `async` functions and blocks
--> $DIR/issue-62009.rs:14:5
|
LL | fn main() {
| ---- this is not `async`
...
LL | (async || 2333)().await;
| ^^^^^^^^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks

error[E0728]: `await` is only allowed inside `async` functions and blocks
--> $DIR/issue-62009.rs:16:5
--> $DIR/issue-62009-1.rs:14:5
|
LL | fn main() {
| ---- this is not `async`
...
LL | (|_| 2333).await;
| ^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks

error[E0277]: the trait bound `[closure@$DIR/issue-62009.rs:16:5: 16:15]: std::future::Future` is not satisfied
--> $DIR/issue-62009.rs:16:5
error[E0277]: the trait bound `[closure@$DIR/issue-62009-1.rs:14:5: 14:15]: std::future::Future` is not satisfied
--> $DIR/issue-62009-1.rs:14:5
|
LL | (|_| 2333).await;
| ^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009.rs:16:5: 16:15]`
| ^^^^^^^^^^^^^^^^ the trait `std::future::Future` is not implemented for `[closure@$DIR/issue-62009-1.rs:14:5: 14:15]`
|
= note: required by `std::future::poll_with_tls_context`

error: aborting due to 5 previous errors
error: aborting due to 4 previous errors

For more information about this error, try `rustc --explain E0277`.
10 changes: 10 additions & 0 deletions src/test/ui/async-await/issues/issue-62009-2.rs
@@ -0,0 +1,10 @@
// edition:2018

#![feature(async_await, async_closure)]

async fn print_dur() {}

fn main() {
(async || 2333)().await;
//~^ ERROR `await` is only allowed inside `async` functions and blocks
}
10 changes: 10 additions & 0 deletions src/test/ui/async-await/issues/issue-62009-2.stderr
@@ -0,0 +1,10 @@
error[E0728]: `await` is only allowed inside `async` functions and blocks
--> $DIR/issue-62009-2.rs:8:5
|
LL | fn main() {
| ---- this is not `async`
LL | (async || 2333)().await;
| ^^^^^^^^^^^^^^^^^^^^^^^ only allowed inside `async` functions and blocks

error: aborting due to previous error

2 changes: 1 addition & 1 deletion src/test/ui/async-await/no-args-non-move-async-closure.rs
@@ -1,6 +1,6 @@
// edition:2018

#![feature(async_await, await_macro)]
#![feature(async_await, async_closure, await_macro)]

fn main() {
let _ = async |x: u8| {};
Expand Down
23 changes: 23 additions & 0 deletions src/test/ui/async-await/suggest-missing-await-closure.fixed
@@ -0,0 +1,23 @@
// edition:2018
// run-rustfix

#![feature(async_await, async_closure)]

fn take_u32(_x: u32) {}

async fn make_u32() -> u32 {
22
}

#[allow(unused)]
async fn suggest_await_in_async_closure() {
async || {
let x = make_u32();
take_u32(x.await)
//~^ ERROR mismatched types [E0308]
//~| HELP consider using `.await` here
//~| SUGGESTION x.await
};
}

fn main() {}
23 changes: 23 additions & 0 deletions src/test/ui/async-await/suggest-missing-await-closure.rs
@@ -0,0 +1,23 @@
// edition:2018
// run-rustfix

#![feature(async_await, async_closure)]

fn take_u32(_x: u32) {}

async fn make_u32() -> u32 {
22
}

#[allow(unused)]
async fn suggest_await_in_async_closure() {
async || {
let x = make_u32();
take_u32(x)
//~^ ERROR mismatched types [E0308]
//~| HELP consider using `.await` here
//~| SUGGESTION x.await
};
}

fn main() {}
15 changes: 15 additions & 0 deletions src/test/ui/async-await/suggest-missing-await-closure.stderr
@@ -0,0 +1,15 @@
error[E0308]: mismatched types
--> $DIR/suggest-missing-await-closure.rs:16:18
|
LL | take_u32(x)
| ^
| |
| expected u32, found opaque type
| help: consider using `.await` here: `x.await`
|
= note: expected type `u32`
found type `impl std::future::Future`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
11 changes: 0 additions & 11 deletions src/test/ui/async-await/suggest-missing-await.fixed
Expand Up @@ -18,15 +18,4 @@ async fn suggest_await_in_async_fn() {
//~| SUGGESTION x.await
}

#[allow(unused)]
async fn suggest_await_in_async_closure() {
async || {
let x = make_u32();
take_u32(x.await)
//~^ ERROR mismatched types [E0308]
//~| HELP consider using `.await` here
//~| SUGGESTION x.await
};
}

fn main() {}
11 changes: 0 additions & 11 deletions src/test/ui/async-await/suggest-missing-await.rs
Expand Up @@ -18,15 +18,4 @@ async fn suggest_await_in_async_fn() {
//~| SUGGESTION x.await
}

#[allow(unused)]
async fn suggest_await_in_async_closure() {
async || {
let x = make_u32();
take_u32(x)
//~^ ERROR mismatched types [E0308]
//~| HELP consider using `.await` here
//~| SUGGESTION x.await
};
}

fn main() {}
14 changes: 1 addition & 13 deletions src/test/ui/async-await/suggest-missing-await.stderr
Expand Up @@ -10,18 +10,6 @@ LL | take_u32(x)
= note: expected type `u32`
found type `impl std::future::Future`

error[E0308]: mismatched types
--> $DIR/suggest-missing-await.rs:25:18
|
LL | take_u32(x)
| ^
| |
| expected u32, found opaque type
| help: consider using `.await` here: `x.await`
|
= note: expected type `u32`
found type `impl std::future::Future`

error: aborting due to 2 previous errors
error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
1 change: 0 additions & 1 deletion src/test/ui/feature-gates/feature-gate-async-await.rs
Expand Up @@ -15,5 +15,4 @@ async fn foo() {} //~ ERROR async fn is unstable

fn main() {
let _ = async {}; //~ ERROR async blocks are unstable
let _ = async || {}; //~ ERROR async closures are unstable
}
11 changes: 1 addition & 10 deletions src/test/ui/feature-gates/feature-gate-async-await.stderr
Expand Up @@ -40,15 +40,6 @@ LL | let _ = async {};
= note: for more information, see https://github.com/rust-lang/rust/issues/50547
= help: add #![feature(async_await)] to the crate attributes to enable

error[E0658]: async closures are unstable
--> $DIR/feature-gate-async-await.rs:18:13
|
LL | let _ = async || {};
| ^^^^^^^^^^^
|
= note: for more information, see https://github.com/rust-lang/rust/issues/50547
= help: add #![feature(async_await)] to the crate attributes to enable

error: aborting due to 6 previous errors
error: aborting due to 5 previous errors

For more information about this error, try `rustc --explain E0658`.

0 comments on commit 43315bc

Please sign in to comment.