rust/tests/ui/async-await/async-closures/force-move-due-to-actually-fnonce.rs

28 lines
730 B
Rust

//@ aux-build:block-on.rs
//@ edition:2021
//@ check-pass
#![feature(async_closure)]
extern crate block_on;
fn consume(_: String) {}
fn main() {
block_on::block_on(async {
let x = 1i32;
let s = String::new();
// `consume(s)` pulls the closure's kind down to `FnOnce`,
// which means that we don't treat the borrow of `x` as a
// self-borrow (with `'env` lifetime). This leads to a lifetime
// error which is solved by forcing the inner coroutine to
// be `move` as well, so that it moves `x`.
let c = async move || {
println!("{x}");
// This makes the closure FnOnce...
consume(s);
};
c().await;
});
}