]> git.proxmox.com Git - rustc.git/blame - src/test/ui/async-await/async-block-control-flow-static-semantics.rs
New upstream version 1.48.0~beta.8+dfsg1
[rustc.git] / src / test / ui / async-await / async-block-control-flow-static-semantics.rs
CommitLineData
416331ca
XL
1// Test that `async { .. }` blocks:
2// 1. do not allow `break` expressions.
3// 2. get targeted by `return` and not the parent function.
4// 3. get targeted by `?` and not the parent function.
5//
6// edition:2018
416331ca 7
416331ca
XL
8fn main() {}
9
10use core::future::Future;
11
12fn return_targets_async_block_not_fn() -> u8 {
13 //~^ ERROR mismatched types
14 let block = async {
15 return 0u8;
16 };
17 let _: &dyn Future<Output = ()> = &block;
1b1a35ee 18 //~^ ERROR type mismatch resolving `<impl Future as Future>::Output == ()`
416331ca
XL
19}
20
21async fn return_targets_async_block_not_async_fn() -> u8 {
e74abb32 22 //~^ ERROR mismatched types
416331ca
XL
23 let block = async {
24 return 0u8;
25 };
26 let _: &dyn Future<Output = ()> = &block;
1b1a35ee 27 //~^ ERROR type mismatch resolving `<impl Future as Future>::Output == ()`
416331ca
XL
28}
29
30fn no_break_in_async_block() {
31 async {
e1599b0c 32 break 0u8; //~ ERROR `break` inside of an `async` block
416331ca
XL
33 };
34}
35
36fn no_break_in_async_block_even_with_outer_loop() {
37 loop {
38 async {
e1599b0c 39 break 0u8; //~ ERROR `break` inside of an `async` block
416331ca
XL
40 };
41 }
42}
43
44struct MyErr;
45fn err() -> Result<u8, MyErr> { Err(MyErr) }
46
47fn rethrow_targets_async_block_not_fn() -> Result<u8, MyErr> {
48 //~^ ERROR mismatched types
49 let block = async {
50 err()?;
51 Ok(())
52 };
53 let _: &dyn Future<Output = Result<(), MyErr>> = &block;
54}
55
56fn rethrow_targets_async_block_not_async_fn() -> Result<u8, MyErr> {
57 //~^ ERROR mismatched types
58 let block = async {
59 err()?;
60 Ok(())
61 };
62 let _: &dyn Future<Output = Result<(), MyErr>> = &block;
63}