mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // Test that `async { .. }` blocks:
 | |
| // 1. do not allow `break` expressions.
 | |
| // 2. get targeted by `return` and not the parent function.
 | |
| // 3. get targeted by `?` and not the parent function.
 | |
| //
 | |
| // edition:2018
 | |
| 
 | |
| fn main() {}
 | |
| 
 | |
| use core::future::Future;
 | |
| 
 | |
| fn return_targets_async_block_not_fn() -> u8 {
 | |
|     //~^ ERROR mismatched types
 | |
|     let block = async {
 | |
|         return 0u8;
 | |
|     };
 | |
|     let _: &dyn Future<Output = ()> = █
 | |
|     //~^ ERROR to be a future that resolves to `()`, but it resolves to `u8`
 | |
| }
 | |
| 
 | |
| async fn return_targets_async_block_not_async_fn() -> u8 {
 | |
|     //~^ ERROR mismatched types [E0308]
 | |
|     let block = async {
 | |
|         return 0u8;
 | |
|     };
 | |
|     let _: &dyn Future<Output = ()> = █
 | |
|     //~^ ERROR to be a future that resolves to `()`, but it resolves to `u8`
 | |
| }
 | |
| 
 | |
| fn no_break_in_async_block() {
 | |
|     async {
 | |
|         break 0u8; //~ ERROR `break` inside of an `async` block
 | |
|     };
 | |
| }
 | |
| 
 | |
| fn no_break_in_async_block_even_with_outer_loop() {
 | |
|     loop {
 | |
|         async {
 | |
|             break 0u8; //~ ERROR `break` inside of an `async` block
 | |
|         };
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct MyErr;
 | |
| fn err() -> Result<u8, MyErr> {
 | |
|     Err(MyErr)
 | |
| }
 | |
| 
 | |
| fn rethrow_targets_async_block_not_fn() -> Result<u8, MyErr> {
 | |
|     //~^ ERROR mismatched types
 | |
|     let block = async {
 | |
|         err()?;
 | |
|         Ok(())
 | |
|     };
 | |
|     let _: &dyn Future<Output = Result<(), MyErr>> = █
 | |
| }
 | |
| 
 | |
| fn rethrow_targets_async_block_not_async_fn() -> Result<u8, MyErr> {
 | |
|     //~^ ERROR mismatched types
 | |
|     let block = async {
 | |
|         err()?;
 | |
|         Ok(())
 | |
|     };
 | |
|     let _: &dyn Future<Output = Result<(), MyErr>> = █
 | |
| }
 | 
