Skip to content

[async closure] implementation of Send is not general enough using tokio channel #139475

Open
@Banyc

Description

@Banyc

I tried this code:

use tokio::sync::mpsc;

pub async fn main() {
    tokio::spawn(async move { run().await });
}

pub async fn run() {
    let (tx, _rx) = mpsc::channel(12);
    let f = async || {
        tx.send(()).await;
    };
    f().await; // ok
    run_async_closure(f).await; // error
}

pub async fn run_async_closure(mut f: impl AsyncFnMut()) {
    f().await;
}

I expected to see this happen: no error as this is a very normal use case of async closure.

Instead, this happened: compiler complaining about the lifetime of the tokio mpsc::Sender.

Meta

rustc --version --verbose:

rustc 1.86.0 (05f9846f8 2025-03-31)
binary: rustc
commit-hash: 05f9846f893b09a1be1fc8560e33fc3c815cfecb
commit-date: 2025-03-31
host: aarch64-apple-darwin
release: 1.86.0
LLVM version: 19.1.7
Backtrace

error: implementation of `Send` is not general enough
 --> src/lib.rs:4:5
  |
4 |     tokio::spawn(async move { run().await });
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Send` is not general enough
  |
  = note: `Send` would have to be implemented for the type `&'0 tokio::sync::mpsc::Sender<()>`, for any lifetime `'0`...
  = note: ...but `Send` is actually implemented for the type `&'1 tokio::sync::mpsc::Sender<()>`, for some specific lifetime `'1`

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-async-closures`async || {}`A-auto-traitsArea: auto traits (e.g., `auto trait Send {}`)A-concurrencyArea: ConcurrencyC-bugCategory: This is a bug.needs-triageThis issue may need triage. Remove it if it has been sufficiently triaged.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions