46 lines
1.1 KiB
Rust
46 lines
1.1 KiB
Rust
// edition:2018
|
|
#![feature(generators, generator_trait)]
|
|
|
|
use std::future::Future;
|
|
use std::ops::Generator;
|
|
|
|
async fn async_fn() {}
|
|
fn returns_async_block() -> impl Future<Output = ()> {
|
|
async {}
|
|
}
|
|
fn returns_generator() -> impl Generator<(), Yield = (), Return = ()> {
|
|
|| {
|
|
let _: () = yield ();
|
|
}
|
|
}
|
|
|
|
fn takes_future(_f: impl Future<Output = ()>) {}
|
|
fn takes_generator<ResumeTy>(_g: impl Generator<ResumeTy, Yield = (), Return = ()>) {}
|
|
|
|
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 ();
|
|
});
|
|
}
|