about summary refs log tree commit diff
path: root/tests/ui/async-await/async-closures/force-move-due-to-inferred-kind.rs
blob: c963d282c4e2f6b0863def767b66b51cb6bc18a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//@ aux-build:block-on.rs
//@ edition:2021
//@ build-pass

extern crate block_on;

fn force_fnonce<T: AsyncFnOnce()>(t: T) -> T { t }

fn main() {
    block_on::block_on(async {
        let x = 1i32;
        // `force_fnonce` 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 = force_fnonce(async move || {
            println!("{x}");
        });
        c().await;
    });
}