@@ -109,7 +109,7 @@ pub unsafe trait PinEmplace<T: ?Sized>: Emplace<T> {
109109///
110110/// **Tips**: `Buffered<T: Future>` implements `Future`, so you can simply write
111111/// `async_hello().init(&mut stack).await` in practice.
112- pub struct Buffered < ' a , T : ?Sized > ( NonNull < T > , PhantomData < & ' a mut [ u8 ] > ) ;
112+ pub struct Buffered < ' a , T : ?Sized > ( NonNull < T > , PhantomData < & ' a mut T > ) ;
113113impl < ' a , T : ?Sized > Buffered < ' a , T > {
114114 /// Constructs a new instance with the provided pointer.
115115 ///
@@ -214,6 +214,11 @@ impl<'a> Buffered<'a, dyn Any + Send + Sync> {
214214 }
215215}
216216
217+ // SAFETY: Since we hold a exclusive reference to `T`, it's okay to inherit the
218+ // `Send` and `Sync` bounds.
219+ unsafe impl < T : ?Sized + Send > Send for Buffered < ' _ , T > { }
220+ unsafe impl < T : ?Sized + Sync > Sync for Buffered < ' _ , T > { }
221+
217222// Pretend `Buffered` owns the value of `T` rather than just a pointer to it.
218223// This, along with the `Buffered::project*` APIs, makes it easy to obtain a
219224// pinned reference to `T` in safe Rust. But the downside is that this prevents
@@ -275,7 +280,7 @@ impl fmt::Display for OutOfCapacity {
275280 }
276281}
277282
278- unsafe impl < ' a , T : ?Sized , const N : usize > Emplace < T > for & ' a mut MaybeUninit < [ u8 ; N ] > {
283+ unsafe impl < ' a , T : ' a + ?Sized , const N : usize > Emplace < T > for & ' a mut MaybeUninit < [ u8 ; N ] > {
279284 type Ptr = Buffered < ' a , T > ;
280285 type Err = OutOfCapacity ;
281286
@@ -287,7 +292,7 @@ unsafe impl<'a, T: ?Sized, const N: usize> Emplace<T> for &'a mut MaybeUninit<[u
287292 uninit_slice. emplace ( constructor)
288293 }
289294}
290- unsafe impl < ' a , T : ?Sized , const N : usize > Emplace < T > for & ' a mut [ MaybeUninit < u8 > ; N ] {
295+ unsafe impl < ' a , T : ' a + ?Sized , const N : usize > Emplace < T > for & ' a mut [ MaybeUninit < u8 > ; N ] {
291296 type Ptr = Buffered < ' a , T > ;
292297 type Err = OutOfCapacity ;
293298
@@ -298,7 +303,7 @@ unsafe impl<'a, T: ?Sized, const N: usize> Emplace<T> for &'a mut [MaybeUninit<u
298303 self . as_mut_slice ( ) . emplace ( constructor)
299304 }
300305}
301- unsafe impl < ' a , T : ?Sized > Emplace < T > for & ' a mut [ MaybeUninit < u8 > ] {
306+ unsafe impl < ' a , T : ' a + ?Sized > Emplace < T > for & ' a mut [ MaybeUninit < u8 > ] {
302307 type Ptr = Buffered < ' a , T > ;
303308 type Err = OutOfCapacity ;
304309
@@ -393,7 +398,7 @@ mod __alloc {
393398
394399 // TODO: pinned vector?
395400 #[ cfg_attr( docsrs, doc( cfg( feature = "alloc" ) ) ) ]
396- unsafe impl < ' a , T : ?Sized > Emplace < T > for & ' a mut Vec < MaybeUninit < u8 > > {
401+ unsafe impl < ' a , T : ' a + ?Sized > Emplace < T > for & ' a mut Vec < MaybeUninit < u8 > > {
397402 type Ptr = Buffered < ' a , T > ;
398403 type Err = Infallible ;
399404
@@ -446,7 +451,7 @@ mod __smallvec {
446451 unsafe impl < ' a , A , T > Emplace < T > for & ' a mut SmallVec < A >
447452 where
448453 A : Array < Item = MaybeUninit < u8 > > ,
449- T : ?Sized ,
454+ T : ' a + ?Sized ,
450455 {
451456 type Ptr = Buffered < ' a , T > ;
452457 type Err = Infallible ;
0 commit comments