rust/tests/ui/async-await/coroutine-not-future.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

46 lines
1.1 KiB
Rust
Raw Normal View History

// edition:2018
2023-10-19 16:46:28 -05:00
#![feature(coroutines, coroutine_trait)]
use std::future::Future;
2023-10-19 11:06:43 -05:00
use std::ops::Coroutine;
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 = ()> {
|| {
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 = ()>) {}
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(|| {
let _: () = yield ();
});
2023-10-19 16:46:28 -05:00
// async futures are not coroutines:
takes_coroutine(async_fn());
//~^ ERROR the trait bound
2023-10-19 16:46:28 -05:00
takes_coroutine(returns_async_block());
//~^ ERROR the trait bound
2023-10-19 16:46:28 -05:00
takes_coroutine(async {});
//~^ ERROR the trait bound
2023-10-19 16:46:28 -05:00
// coroutines are not futures:
takes_future(returns_coroutine());
//~^ ERROR is not a future
takes_future(|ctx| {
//~^ ERROR is not a future
ctx = yield ();
});
}