rust-lang / rust

Empowering everyone to build reliable and efficient software.
https://www.rust-lang.org
Other
94.84k stars 12.22k forks source link

`async_closure`: error: implementation of `AsyncFnOnce` is not general enough #126350

Open Jacherr opened 3 weeks ago

Jacherr commented 3 weeks ago

I'm not sure if this is really a bug (or perhaps a duplicate issue of another bug). However, I can't see any reason why this shouldn't work.

I tried this code:

#![feature(async_closure)]

fn assert_send<T: Send>(_: T) {}

#[derive(Clone)]
struct Ctxt<'a>(&'a ());

async fn commit_if_ok<'a>(ctxt: &mut Ctxt<'a>, f: impl async FnOnce(&mut Ctxt<'a>)) {
    f(&mut ctxt.clone()).await;
}

fn operation(mut ctxt: Ctxt<'_>) {
    assert_send(async {
        commit_if_ok(&mut ctxt, async |_| todo!()).await;
    });
}

fn main() {}

I expected to see this happen: Code compiles successfully

Instead, this happened: Compile error:

error: implementation of `AsyncFnOnce` is not general enough
  --> src/lib.rs:13:5
   |
13 | /     assert_send(async {
14 | |         commit_if_ok(&mut ctxt, async |_| todo!()).await;
15 | |     });
   | |______^ implementation of `AsyncFnOnce` is not general enough
   |
   = note: `{async closure@src/lib.rs:14:33: 14:42}` must implement `AsyncFnOnce<(&mut Ctxt<'1>,)>`, for any two lifetimes `'0` and `'1`...
   = note: ...but it actually implements `AsyncFnOnce<(&mut Ctxt<'_>,)>`

error: could not compile `playground` (lib) due to 1 previous error

(see https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=536db823e50d32307ee54645dbec25c6)

Meta

rustc --version --verbose:

rustc 1.80.0-nightly (032af18af 2024-06-02)
binary: rustc
commit-hash: 032af18af578f4283a2927fb43b90df2bbb72b67
commit-date: 2024-06-02
host: x86_64-unknown-linux-gnu
release: 1.80.0-nightly
LLVM version: 18.1.6

compiler-errors commented 3 weeks ago

actually this has nothing to do with async closures

this is one of many issues having to do with async, higher ranked bounds, and Send/Sync :( #110338