mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ edition: 2021
 | |
| 
 | |
| use std::{
 | |
|     future::Future,
 | |
|     pin::Pin,
 | |
|     task::{Context, Poll, Waker},
 | |
| };
 | |
| 
 | |
| pub struct StructAsync<F: Fn() -> Pin<Box<dyn Future<Output = ()>>>> {
 | |
|     pub callback: F,
 | |
| }
 | |
| 
 | |
| impl<F> Future for StructAsync<F>
 | |
| where
 | |
|     F: Fn() -> Pin<Box<dyn Future<Output = ()>>>,
 | |
| {
 | |
|     type Output = ();
 | |
| 
 | |
|     fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {
 | |
|         Poll::Pending
 | |
|     }
 | |
| }
 | |
| 
 | |
| async fn callback() {}
 | |
| 
 | |
| struct Runtime;
 | |
| 
 | |
| fn waker() -> &'static Waker {
 | |
|     todo!()
 | |
| }
 | |
| 
 | |
| impl Runtime {
 | |
|     #[track_caller]
 | |
|     pub fn block_on<F: Future>(&self, mut future: F) -> F::Output {
 | |
|         loop {
 | |
|             unsafe {
 | |
|                 Pin::new_unchecked(&mut future).poll(&mut Context::from_waker(waker()));
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     Runtime.block_on(async {
 | |
|         StructAsync { callback }.await;
 | |
|         //~^ ERROR expected `callback` to be a fn item that returns `Pin<Box<dyn Future<Output = ()>>>`, but it returns `impl Future<Output = ()>`
 | |
|         //~| ERROR expected `callback` to be a fn item that returns `Pin<Box<dyn Future<Output = ()>>>`, but it returns `impl Future<Output = ()>`
 | |
|         //~| ERROR expected `callback` to be a fn item that returns `Pin<Box<dyn Future<Output = ()>>>`, but it returns `impl Future<Output = ()>`
 | |
|     });
 | |
| }
 | 
