Closed
Description
The following async function appears to not implement Send
: (simpler reproducer at second post from @Nemo157 using generators)
pub async fn __receive() -> ()
{
let mut chan: futures::channel::mpsc::Receiver<Box<Send + 'static>> = None.unwrap();
await!(chan.next());
}
As futures::channel::mpsc::Receiver
has an impl of Send+Sync
when its generic parameter is Send
, and Box<Send + 'static>
is Send
, I would expect the future returned by this function to be Send
. However, when trying to require it, I get:
error[E0277]: `dyn std::marker::Send` cannot be sent between threads safely
--> erlust/src/lib.rs:30:9
|
30 | spawn(__receive());
| ^^^^^ `dyn std::marker::Send` cannot be sent between threads safely
|
= help: the trait `for<'r> std::marker::Send` is not implemented for `dyn std::marker::Send`
= note: required because of the requirements on the impl of `for<'r> std::marker::Send` for `std::ptr::Unique<dyn std::marker::Send>`
= note: required because it appears within the type `std::boxed::Box<dyn std::marker::Send>`
= note: required because of the requirements on the impl of `for<'r> std::marker::Send` for `futures::channel::mpsc::Inner<std::boxed::Box<dyn std::marker::Send>>`
= note: required because of the requirements on the impl of `for<'r> std::marker::Send` for `std::sync::Arc<futures::channel::mpsc::Inner<std::boxed::Box<dyn std::marker::Send>>>`
= note: required because it appears within the type `futures::channel::mpsc::Receiver<std::boxed::Box<dyn std::marker::Send>>`
= note: required because it appears within the type `for<'r, 's, 't0> {futures::channel::mpsc::Receiver<std::boxed::Box<(dyn std::marker::Send + 'r)>>, futures::stream::Next<'s, futures::channel::mpsc::Receiver<std::boxed::Box<(dyn std::marker::Send + 't0)>>>, ()}`
= note: required because it appears within the type `[static generator@erlust/src/lib.rs:18:1: 22:2 for<'r, 's, 't0> {futures::channel::mpsc::Receiver<std::boxed::Box<(dyn std::marker::Send + 'r)>>, futures::stream::Next<'s, futures::channel::mpsc::Receiver<std::boxed::Box<(dyn std::marker::Send + 't0)>>>, ()}]`
= note: required because it appears within the type `std::future::GenFuture<[static generator@erlust/src/lib.rs:18:1: 22:2 for<'r, 's, 't0> {futures::channel::mpsc::Receiver<std::boxed::Box<(dyn std::marker::Send + 'r)>>, futures::stream::Next<'s, futures::channel::mpsc::Receiver<std::boxed::Box<(dyn std::marker::Send + 't0)>>>, ()}]>`
= note: required because it appears within the type `impl futures::Future`
= note: required because it appears within the type `impl futures::Future`
I am not 100% sure this issue is actually tied to async/await, but removing the await!
makes the issue vanish, so… cc #50547
A full reproducer can be found here, but unfortunately doesn't compile on the playground due to lack of futures-0.3
.