2022-11-30 12:34:19 -06:00
|
|
|
//@ edition:2018
|
2023-10-19 16:46:28 -05:00
|
|
|
#![feature(coroutines, coroutine_trait)]
|
2022-11-30 12:34:19 -06:00
|
|
|
|
|
|
|
use std::future::Future;
|
2023-10-19 11:06:43 -05:00
|
|
|
use std::ops::Coroutine;
|
2022-11-30 12:34:19 -06:00
|
|
|
|
|
|
|
async fn async_fn() {}
|
|
|
|
fn returns_async_block() -> impl Future<Output = ()> {
|
|
|
|
async {}
|
|
|
|
}
|
2023-10-19 16:46:28 -05:00
|
|
|
fn returns_coroutine() -> impl Coroutine<(), Yield = (), Return = ()> {
|
2022-11-30 12:34:19 -06:00
|
|
|
|| {
|
|
|
|
let _: () = yield ();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn takes_future(_f: impl Future<Output = ()>) {}
|
2023-10-19 16:46:28 -05:00
|
|
|
fn takes_coroutine<ResumeTy>(_g: impl Coroutine<ResumeTy, Yield = (), Return = ()>) {}
|
2022-11-30 12:34:19 -06:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
// okay:
|
|
|
|
takes_future(async_fn());
|
|
|
|
takes_future(returns_async_block());
|
|
|
|
takes_future(async {});
|
2023-10-19 16:46:28 -05:00
|
|
|
takes_coroutine(returns_coroutine());
|
|
|
|
takes_coroutine(|| {
|
2022-11-30 12:34:19 -06:00
|
|
|
let _: () = yield ();
|
|
|
|
});
|
|
|
|
|
2023-10-19 16:46:28 -05:00
|
|
|
// async futures are not coroutines:
|
|
|
|
takes_coroutine(async_fn());
|
2022-11-30 12:34:19 -06:00
|
|
|
//~^ ERROR the trait bound
|
2023-10-19 16:46:28 -05:00
|
|
|
takes_coroutine(returns_async_block());
|
2022-11-30 12:34:19 -06:00
|
|
|
//~^ ERROR the trait bound
|
2023-10-19 16:46:28 -05:00
|
|
|
takes_coroutine(async {});
|
2022-11-30 12:34:19 -06:00
|
|
|
//~^ ERROR the trait bound
|
|
|
|
|
2023-10-19 16:46:28 -05:00
|
|
|
// coroutines are not futures:
|
|
|
|
takes_future(returns_coroutine());
|
2022-11-30 12:34:19 -06:00
|
|
|
//~^ ERROR is not a future
|
|
|
|
takes_future(|ctx| {
|
|
|
|
//~^ ERROR is not a future
|
|
|
|
ctx = yield ();
|
|
|
|
});
|
|
|
|
}
|