mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	 b8a217081d
			
		
	
	
		b8a217081d
		
	
	
	
	
		
			
			Also properly attaches spans on layouts of non-promoted coroutine locals, which slightly improves the error messages for some coroutine tests.
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ check-fail
 | |
| //@ edition: 2021
 | |
| 
 | |
| use std::future::Future;
 | |
| use std::pin::pin;
 | |
| use std::task::*;
 | |
| 
 | |
| pub fn block_on<T>(fut: impl Future<Output = T>) -> T {
 | |
|     let mut fut = pin!(fut);
 | |
|     // Poll loop, just to test the future...
 | |
|     let ctx = &mut Context::from_waker(Waker::noop());
 | |
| 
 | |
|     loop {
 | |
|         match fut.as_mut().poll(ctx) {
 | |
|             Poll::Pending => {}
 | |
|             Poll::Ready(t) => break t,
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| trait Blah {
 | |
|     async fn iter<T>(&mut self, iterator: T)
 | |
|     where
 | |
|         T: IntoIterator<Item = ()>;
 | |
| }
 | |
| 
 | |
| impl Blah for () {
 | |
|     async fn iter<T>(&mut self, iterator: T)
 | |
|     //~^ ERROR recursion in an async fn requires boxing
 | |
|     where
 | |
|         T: IntoIterator<Item = ()>,
 | |
|     {
 | |
|         Blah::iter(self, iterator).await
 | |
|     }
 | |
| }
 | |
| 
 | |
| struct Wrap<T: Blah> {
 | |
|     t: T,
 | |
| }
 | |
| 
 | |
| impl<T: Blah> Wrap<T>
 | |
| where
 | |
|     T: Blah,
 | |
| {
 | |
|     async fn ice(&mut self) {
 | |
|         let arr: [(); 0] = [];
 | |
|         self.t.iter(arr.into_iter()).await;
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     block_on(async {
 | |
|         let mut t = Wrap { t: () };
 | |
|         t.ice();
 | |
|     })
 | |
| }
 |