//@ edition:2018 #![feature(coroutines, coroutine_trait, stmt_expr_attributes)] use std::future::Future; use std::ops::Coroutine; async fn async_fn() {} fn returns_async_block() -> impl Future { async {} } fn returns_coroutine() -> impl Coroutine<(), Yield = (), Return = ()> { #[coroutine] || { let _: () = yield (); } } fn takes_future(_f: impl Future) {} fn takes_coroutine(_g: impl Coroutine) {} fn main() { // okay: takes_future(async_fn()); takes_future(returns_async_block()); takes_future(async {}); takes_coroutine(returns_coroutine()); takes_coroutine( #[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( #[coroutine] |ctx| { //~^ ERROR is not a future ctx = yield (); }, ); }