Skip to content

Async code causes error "one type is more general than the other" (expected async block, found that same async block) when demanding an impl Send #126549

Closed as not planned
@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 { }.then(|_| async { &THING })];
    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[E0308]: mismatched types
  --> src/lib.rs:4:5
   |
4  |     foo()
   |     ^^^^^ one type is more general than the other
...
10 |     let updates = [async { }.then(|_| async { &THING })];
   |                                       ----------------
   |                                       |
   |                                       the expected `async` block
   |                                       the found `async` block
   |
   = note: expected `async` block `{async block@src/lib.rs:10:39: 10:55}`
              found `async` block `{async block@src/lib.rs:10:39: 10:55}`

For more information about this error, try `rustc --explain E0308`.
error: could not compile `playground` (lib) due to 1 previous error

See also #126551, 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

    C-bugCategory: This is a bug.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions