From 1574c2dee2e26d78fb0f00bcd97beabd326f6723 Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 12 Jul 2019 13:04:41 +1000 Subject: [PATCH 1/7] align async-await.rs and await-macro.rs with one another --- src/test/ui/async-await/async-await.rs | 10 +++++++++- src/test/ui/async-await/await-macro.rs | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/test/ui/async-await/async-await.rs b/src/test/ui/async-await/async-await.rs index 29622c9d030a3..b9d82014bb982 100644 --- a/src/test/ui/async-await/async-await.rs +++ b/src/test/ui/async-await/async-await.rs @@ -3,7 +3,7 @@ // edition:2018 // aux-build:arc_wake.rs -#![feature(async_await)] +#![feature(async_await, async_closure)] extern crate arc_wake; @@ -70,6 +70,13 @@ fn async_nonmove_block(x: u8) -> impl Future { } } +fn async_closure(x: u8) -> impl Future { + (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 @@ -173,6 +180,7 @@ fn main() { test! { async_block, async_nonmove_block, + async_closure, async_fn, generic_async_fn, async_fn_with_internal_borrow, diff --git a/src/test/ui/async-await/await-macro.rs b/src/test/ui/async-await/await-macro.rs index c37835d73e92b..7729cdf3cd932 100644 --- a/src/test/ui/async-await/await-macro.rs +++ b/src/test/ui/async-await/await-macro.rs @@ -134,11 +134,15 @@ trait Bar { } impl Foo { - async fn async_method(x: u8) -> u8 { + async fn async_assoc_item(x: u8) -> u8 { unsafe { await!(unsafe_async_fn(x)) } } + + async unsafe fn async_unsafe_assoc_item(x: u8) -> u8 { + await!(unsafe_async_fn(x)) + } } fn test_future_yields_once_then_returns(f: F) @@ -180,12 +184,17 @@ fn main() { async_fn, generic_async_fn, async_fn_with_internal_borrow, - Foo::async_method, + Foo::async_assoc_item, |x| { async move { unsafe { await!(unsafe_async_fn(x)) } } }, + |x| { + async move { + unsafe { await!(Foo::async_unsafe_assoc_item(x)) } + } + }, } test_with_borrow! { async_block_with_borrow_named_lifetime, From 0f66ce65dbdef43e8459a3bc771d3fe05ad2063d Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 12 Jul 2019 13:32:39 +1000 Subject: [PATCH 2/7] test E0133 when calling free/impl `async unsafe fn` in safe code --- .../async-unsafe-fn-call-in-safe.rs | 16 ++++++++++++++++ .../async-unsafe-fn-call-in-safe.stderr | 19 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs create mode 100644 src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr diff --git a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs new file mode 100644 index 0000000000000..f1a7d6256692b --- /dev/null +++ b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs @@ -0,0 +1,16 @@ +// edition:2018 + +#![feature(async_await, async_closure)] + +struct S; + +impl S { + async unsafe fn f() {} +} + +async unsafe fn f() {} + +fn main() { + S::f(); //~ ERROR call to unsafe function is unsafe + f(); //~ ERROR call to unsafe function is unsafe +} diff --git a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr new file mode 100644 index 0000000000000..21ba45d7f1e15 --- /dev/null +++ b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr @@ -0,0 +1,19 @@ +error[E0133]: call to unsafe function is unsafe and requires unsafe function or block + --> $DIR/async-unsafe-fn-call-in-safe.rs:14:5 + | +LL | S::f(); + | ^^^^^^ call to unsafe function + | + = note: consult the function's documentation for information on how to avoid undefined behavior + +error[E0133]: call to unsafe function is unsafe and requires unsafe function or block + --> $DIR/async-unsafe-fn-call-in-safe.rs:15:5 + | +LL | f(); + | ^^^ call to unsafe function + | + = note: consult the function's documentation for information on how to avoid undefined behavior + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0133`. From beb2435724acb9344fb64358a8c937d971a5e04c Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 12 Jul 2019 14:08:39 +1000 Subject: [PATCH 3/7] test `unsafe fn` and `async unsafe fn` calls in `async` in `unsafe` --- src/test/ui/async-await/async-await.rs | 13 +++++++++++++ src/test/ui/async-await/await-macro.rs | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/test/ui/async-await/async-await.rs b/src/test/ui/async-await/async-await.rs index b9d82014bb982..26404757aa4b5 100644 --- a/src/test/ui/async-await/async-await.rs +++ b/src/test/ui/async-await/async-await.rs @@ -127,6 +127,18 @@ async unsafe fn unsafe_async_fn(x: u8) -> u8 { x } +unsafe fn unsafe_fn(x: u8) -> u8 { + x +} + +fn async_block_in_unsafe_block(x: u8) -> impl Future { + unsafe { + async move { + unsafe_fn(unsafe_async_fn(x).await) + } + } +} + struct Foo; trait Bar { @@ -184,6 +196,7 @@ fn main() { async_fn, generic_async_fn, async_fn_with_internal_borrow, + async_block_in_unsafe_block, Foo::async_assoc_item, |x| { async move { diff --git a/src/test/ui/async-await/await-macro.rs b/src/test/ui/async-await/await-macro.rs index 7729cdf3cd932..9ac0ab7c6c78f 100644 --- a/src/test/ui/async-await/await-macro.rs +++ b/src/test/ui/async-await/await-macro.rs @@ -127,6 +127,18 @@ async unsafe fn unsafe_async_fn(x: u8) -> u8 { x } +unsafe fn unsafe_fn(x: u8) -> u8 { + x +} + +fn async_block_in_unsafe_block(x: u8) -> impl Future { + unsafe { + async move { + unsafe_fn(await!(unsafe_async_fn(x))) + } + } +} + struct Foo; trait Bar { @@ -184,6 +196,7 @@ fn main() { async_fn, generic_async_fn, async_fn_with_internal_borrow, + async_block_in_unsafe_block, Foo::async_assoc_item, |x| { async move { From e65c1c44a2775f95fcd120bc1b9ac2f04c61890d Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 12 Jul 2019 14:42:44 +1000 Subject: [PATCH 4/7] remove unused #![feature(async_closure)] Co-Authored-By: Mazdak Farrokhzad --- src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs index f1a7d6256692b..25302d94713a7 100644 --- a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs +++ b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs @@ -1,6 +1,6 @@ // edition:2018 -#![feature(async_await, async_closure)] +#![feature(async_await)] struct S; From 60f480dacbc4ee0dbe5bd7dfa6efe0458ea6aab2 Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 12 Jul 2019 14:43:52 +1000 Subject: [PATCH 5/7] test E0133 when calling free/impl `async unsafe fn` in `async fn` --- .../async-unsafe-fn-call-in-safe.rs | 5 +++++ .../async-unsafe-fn-call-in-safe.stderr | 18 +++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs index 25302d94713a7..cb9156dcc6e58 100644 --- a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs +++ b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.rs @@ -10,6 +10,11 @@ impl S { async unsafe fn f() {} +async fn g() { + S::f(); //~ ERROR call to unsafe function is unsafe + f(); //~ ERROR call to unsafe function is unsafe +} + fn main() { S::f(); //~ ERROR call to unsafe function is unsafe f(); //~ ERROR call to unsafe function is unsafe diff --git a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr index 21ba45d7f1e15..d22413beecbcf 100644 --- a/src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr +++ b/src/test/ui/async-await/async-unsafe-fn-call-in-safe.stderr @@ -14,6 +14,22 @@ LL | f(); | = note: consult the function's documentation for information on how to avoid undefined behavior -error: aborting due to 2 previous errors +error[E0133]: call to unsafe function is unsafe and requires unsafe function or block + --> $DIR/async-unsafe-fn-call-in-safe.rs:19:5 + | +LL | S::f(); + | ^^^^^^ call to unsafe function + | + = note: consult the function's documentation for information on how to avoid undefined behavior + +error[E0133]: call to unsafe function is unsafe and requires unsafe function or block + --> $DIR/async-unsafe-fn-call-in-safe.rs:20:5 + | +LL | f(); + | ^^^ call to unsafe function + | + = note: consult the function's documentation for information on how to avoid undefined behavior + +error: aborting due to 4 previous errors For more information about this error, try `rustc --explain E0133`. From d023e47877d28ffdaeb586c50d1271970f7c84f4 Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 12 Jul 2019 14:49:22 +1000 Subject: [PATCH 6/7] remove redundant async_closure test in async-await.rs --- src/test/ui/async-await/async-await.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/test/ui/async-await/async-await.rs b/src/test/ui/async-await/async-await.rs index 26404757aa4b5..dbcba812a40ca 100644 --- a/src/test/ui/async-await/async-await.rs +++ b/src/test/ui/async-await/async-await.rs @@ -70,12 +70,7 @@ fn async_nonmove_block(x: u8) -> impl Future { } } -fn async_closure(x: u8) -> impl Future { - (async move |x: u8| -> u8 { - wake_and_yield_once().await; - x - })(x) -} +// see async-closure.rs for async_closure async fn async_fn(x: u8) -> u8 { wake_and_yield_once().await; @@ -192,7 +187,6 @@ fn main() { test! { async_block, async_nonmove_block, - async_closure, async_fn, generic_async_fn, async_fn_with_internal_borrow, From 5f8d0a1920de9973f980423cd29dbed2eed0b92c Mon Sep 17 00:00:00 2001 From: Delan Azabani Date: Fri, 12 Jul 2019 14:54:52 +1000 Subject: [PATCH 7/7] test `unsafe fn` and `async unsafe fn` calls in `unsafe { async || }` --- src/test/ui/async-await/async-await.rs | 4 ++-- src/test/ui/async-await/async-closure.rs | 16 ++++++++++++++++ src/test/ui/async-await/await-macro.rs | 7 +++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/test/ui/async-await/async-await.rs b/src/test/ui/async-await/async-await.rs index dbcba812a40ca..5ec99c5d183fb 100644 --- a/src/test/ui/async-await/async-await.rs +++ b/src/test/ui/async-await/async-await.rs @@ -3,7 +3,7 @@ // edition:2018 // aux-build:arc_wake.rs -#![feature(async_await, async_closure)] +#![feature(async_await)] extern crate arc_wake; @@ -70,7 +70,7 @@ fn async_nonmove_block(x: u8) -> impl Future { } } -// see async-closure.rs for async_closure +// see async-closure.rs for async_closure + async_closure_in_unsafe_block async fn async_fn(x: u8) -> u8 { wake_and_yield_once().await; diff --git a/src/test/ui/async-await/async-closure.rs b/src/test/ui/async-await/async-closure.rs index f5dc9e24d2d86..925b54b398517 100644 --- a/src/test/ui/async-await/async-closure.rs +++ b/src/test/ui/async-await/async-closure.rs @@ -53,6 +53,21 @@ fn async_closure(x: u8) -> impl Future { })(x) } +fn async_closure_in_unsafe_block(x: u8) -> impl Future { + (unsafe { + async move |x: u8| unsafe_fn(unsafe_async_fn(x).await) + })(x) +} + +async unsafe fn unsafe_async_fn(x: u8) -> u8 { + wake_and_yield_once().await; + x +} + +unsafe fn unsafe_fn(x: u8) -> u8 { + x +} + fn test_future_yields_once_then_returns(f: F) where F: FnOnce(u8) -> Fut, @@ -77,5 +92,6 @@ fn main() { test! { async_closure, + async_closure_in_unsafe_block, } } diff --git a/src/test/ui/async-await/await-macro.rs b/src/test/ui/async-await/await-macro.rs index 9ac0ab7c6c78f..b9cd3903513a4 100644 --- a/src/test/ui/async-await/await-macro.rs +++ b/src/test/ui/async-await/await-macro.rs @@ -77,6 +77,12 @@ fn async_closure(x: u8) -> impl Future { })(x) } +fn async_closure_in_unsafe_block(x: u8) -> impl Future { + (unsafe { + async move |x: u8| unsafe_fn(await!(unsafe_async_fn(x))) + })(x) +} + async fn async_fn(x: u8) -> u8 { await!(wake_and_yield_once()); x @@ -193,6 +199,7 @@ fn main() { async_block, async_nonmove_block, async_closure, + async_closure_in_unsafe_block, async_fn, generic_async_fn, async_fn_with_internal_borrow,