Change:
<!-- Thank you for filing a bug report! Please provide a short summary of the bug, along with any information you feel relevant to replicating the bug. If you cannot produce a minimal reproduction case (something that would work in isolation), please provide the steps or even link to a repository that causes the problematic output to occur. --Given the following code: The current output is: The compiler helpfully points out that is required, but nonetheless and I both got confused by this error for some time before we noticed it. The suggestion was kind of buried by all the other details.
I'm not sure the ideal output, but it might be something like this:
This error can be replicated without any external crates (i.e., without ) like so:

Discussion:
} } GeneratorInteriorOrUpvar::Upvar(upvar_span) => { <ins> // `Some(ref_ty)` if `target_ty` is `&T` and `T` fails to impl `Sync` let refers_to_non_sync = match target_ty.kind() { ty::Ref(_, ref_ty, _) => match self.evaluate_obligation(&obligation) { Ok(eval) if !eval.may_apply() => Some(ref_ty), _ => None, }, _ => None, }; let (span_label, span_note) = match refers_to_non_sync { // if `target_ty` is `&T` and `T` fails to impl `Sync`, // include suggestions to make `T: Sync` so that `&T: Send` Some(ref_ty) => ( format!( "has type `{}` which {}, because `{}` is not `Sync`", target_ty, trait_explanation, ref_ty ), format!( "captured value {} because `&` references cannot be sent unless their referent is `Sync`", trait_explanation ), ), None => ( format!("has type `{}` which {}", target_ty, trait_explanation), format!("captured value {}", trait_explanation), ), }; </ins> let mut span = MultiSpan::from_span(upvar_span); <del> span.push_span_label( upvar_span, format!("has type `{}` which {}", target_ty, trait_explanation), ); err.span_note(span, &format!("captured value {}", trait_explanation)); </del> <ins> span.push_span_label(upvar_span, span_label); err.span_note(span, &span_note); </ins> } }

<ins> // edition:2018 use ::core::pin::Pin; use ::core::future::Future; use ::core::marker::Send; trait Foo { fn bar<'me, 'async_trait, T: Send>(x: &'me T) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>> where 'me: 'async_trait; } impl Foo for () { fn bar<'me, 'async_trait, T: Send>(x: &'me T) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>> where 'me:'async_trait { Box::pin( //~ ERROR future cannot be sent between threads safely async move { let x = x; } ) } } fn main() { } </ins>

<ins> error: future cannot be sent between threads safely --> $DIR/issue-86507.rs:17:13 | LL | /             Box::pin( LL | |                 async move { LL | |                     let x = x; LL | |                 } LL | |             ) | |_____________^ future created by async block is not `Send` | note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync` --> $DIR/issue-86507.rs:19:29 | LL |                     let x = x; |                             ^ has type `&T` which is not `Send`, because `T` is not `Sync` = note: required for the cast to the object type `dyn Future<Output = ()> + Send` help: consider further restricting type parameter `T` | LL |         where 'me:'async_trait, T: std::marker::Sync { |                               ^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error </ins>

LL | async fn private_future2(rc: Rc<[u8]>, cell: &Cell<usize>) -> bool { |                          ^^ has type `std::rc::Rc<[u8]>` which is not `Send` = note: `std::rc::Rc<[u8]>` doesn't implement `std::marker::Send` <del> note: captured value is not `Send` </del> <ins> note: captured value is not `Send` because `&` references cannot be sent unless their referent is `Sync` </ins> --> $DIR/future_not_send.rs:20:40 | LL | async fn private_future2(rc: Rc<[u8]>, cell: &Cell<usize>) -> bool { <del> |                                        ^^^^ has type `&std::cell::Cell<usize>` which is not `Send` </del> <ins> |                                        ^^^^ has type `&std::cell::Cell<usize>` which is not `Send`, because `std::cell::Cell<usize>` is not `Sync` </ins> = note: `std::cell::Cell<usize>` doesn't implement `std::marker::Sync` error: future cannot be sent between threads safely