File: issue-98634.rs

package info (click to toggle)
rustc-web 1.78.0%2Bdfsg1-2~deb12u3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,245,420 kB
  • sloc: xml: 147,985; javascript: 18,022; sh: 11,083; python: 10,265; ansic: 6,172; cpp: 5,023; asm: 4,390; makefile: 4,269
file content (50 lines) | stat: -rw-r--r-- 1,304 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
//@ 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 = ()>`
    });
}