Skip to content

Async code causes error "implementation of FnOnce is not general enough" when demanding an impl Send #126551

@theemathas

Description

@theemathas

Credit to @Ciel-MC for discovering this.

I tried this code:

use futures::prelude::future::{join_all, FutureExt}; fn foo_is_send() -> impl Send { foo() } static THING: () = (); async fn foo() { let updates = [async { &THING }.then(|_| async {})]; join_all(updates).await; }

I expected the code to compile without errors. Instead, I got the following compile error:

 Compiling playground v0.0.1 (/playground) error: implementation of `FnOnce` is not general enough --> src/lib.rs:4:5 | 4 | foo() | ^^^^^ implementation of `FnOnce` is not general enough | = note: closure with signature `fn(&'0 ()) -> {async block@src/lib.rs:10:46: 10:54}` must implement `FnOnce<(&'1 (),)>`, for any two lifetimes `'0` and `'1`... = note: ...but it actually implements `FnOnce<(&(),)>` error: could not compile `playground` (lib) due to 1 previous error

Possibly related to #126044

See also #126550, which has similar reproduction code.

Meta

Tested on the playground with stable (1.79.0) and nightly (1.81.0-nightly (2024-06-15 3cf924b))

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-async-awaitArea: Async & AwaitA-diagnosticsArea: Messages for errors, warnings, and lintsAsyncAwait-TriagedAsync-await issues that have been triaged during a working group meeting.D-confusingDiagnostics: Confusing error or lint that should be reworked.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions