// Repro for . //@ edition: 2021 //@ revisions: assumptions no_assumptions //@[assumptions] compile-flags: -Zhigher-ranked-assumptions //@[assumptions] known-bug: unknown //@[no_assumptions] known-bug: #110338 use std::marker::PhantomData; trait Callable<'a>: Send + Sync { fn callable(data: &'a [u8]); } trait Getter<'a>: Send + Sync { type ItemSize: Send + Sync; fn get(data: &'a [u8]); } struct List<'a, A: Getter<'a>> { data: &'a [u8], item_size: A::ItemSize, // Removing this member causes the code to compile phantom: PhantomData, } struct GetterImpl<'a, T: Callable<'a> + 'a> { p: PhantomData<&'a T>, } impl<'a, T: Callable<'a> + 'a> Getter<'a> for GetterImpl<'a, T> { type ItemSize = (); fn get(data: &'a [u8]) { ::callable(data); } } struct ConstructableImpl<'a> { _data: &'a [u8], } impl<'a> Callable<'a> for ConstructableImpl<'a> { fn callable(_: &'a [u8]) {} } struct StructWithLifetime<'a> { marker: &'a PhantomData, } async fn async_method() {} fn assert_send(_: impl Send + Sync) {} // This async method ought to be send, but is not async fn my_send_async_method(_struct_with_lifetime: &mut StructWithLifetime<'_>, data: &Vec) { let _named = List::<'_, GetterImpl>> { data, item_size: (), phantom: PhantomData }; // Moving the await point above the constructed of _named, causes // the method to become send, even though _named is Send + Sync async_method().await; assert_send(_named); } fn dummy(struct_with_lifetime: &mut StructWithLifetime<'_>, data: &Vec) { assert_send(my_send_async_method(struct_with_lifetime, data)); } fn main() {}