// edition:2018 #![feature(generators, generator_trait)] use std::future::Future; use std::ops::Generator; async fn async_fn() {} fn returns_async_block() -> impl Future { async {} } fn returns_generator() -> impl Generator<(), Yield = (), Return = ()> { || { let _: () = yield (); } } fn takes_future(_f: impl Future) {} fn takes_generator(_g: impl Generator) {} fn main() { // okay: takes_future(async_fn()); takes_future(returns_async_block()); takes_future(async {}); takes_generator(returns_generator()); takes_generator(|| { let _: () = yield (); }); // async futures are not generators: takes_generator(async_fn()); //~^ ERROR the trait bound takes_generator(returns_async_block()); //~^ ERROR the trait bound takes_generator(async {}); //~^ ERROR the trait bound // generators are not futures: takes_future(returns_generator()); //~^ ERROR is not a future takes_future(|ctx| { //~^ ERROR is not a future ctx = yield (); }); }