summaryrefslogtreecommitdiffstats
path: root/tests/ui/async-await/coroutine-not-future.rs
blob: b18635fea3974be764d69c8f4cb675a3f301353c (plain)
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
// edition:2018
#![feature(coroutines, coroutine_trait)]

use std::future::Future;
use std::ops::Coroutine;

async fn async_fn() {}
fn returns_async_block() -> impl Future<Output = ()> {
    async {}
}
fn returns_coroutine() -> impl Coroutine<(), Yield = (), Return = ()> {
    || {
        let _: () = yield ();
    }
}

fn takes_future(_f: impl Future<Output = ()>) {}
fn takes_coroutine<ResumeTy>(_g: impl Coroutine<ResumeTy, Yield = (), Return = ()>) {}

fn main() {
    // okay:
    takes_future(async_fn());
    takes_future(returns_async_block());
    takes_future(async {});
    takes_coroutine(returns_coroutine());
    takes_coroutine(|| {
        let _: () = yield ();
    });

    // async futures are not coroutines:
    takes_coroutine(async_fn());
    //~^ ERROR the trait bound
    takes_coroutine(returns_async_block());
    //~^ ERROR the trait bound
    takes_coroutine(async {});
    //~^ ERROR the trait bound

    // coroutines are not futures:
    takes_future(returns_coroutine());
    //~^ ERROR is not a future
    takes_future(|ctx| {
        //~^ ERROR is not a future
        ctx = yield ();
    });
}