11use std:: alloc:: Allocator ;
22
3+ use rustc_serialize:: PointeeSized ;
4+
35#[ diagnostic:: on_unimplemented( message = "`{Self}` doesn't implement `DynSend`. \
46 Add it to `rustc_data_structures::marker` or use `IntoDynSyncSend` if it's already `Send`") ]
57// This is an auto trait for types which can be sent across threads if `sync::is_dyn_thread_safe()`
@@ -15,7 +17,7 @@ pub unsafe auto trait DynSend {}
1517pub unsafe auto trait DynSync { }
1618
1719// Same with `Sync` and `Send`.
18- unsafe impl < T : DynSync + ?Sized > DynSend for & T { }
20+ unsafe impl < T : DynSync + ?Sized + PointeeSized > DynSend for & T { }
1921
2022macro_rules! impls_dyn_send_neg {
2123 ( $( [ $t1: ty $( where $( $generics1: tt) * ) ?] ) * ) => {
@@ -27,9 +29,9 @@ macro_rules! impls_dyn_send_neg {
2729impls_dyn_send_neg ! (
2830 [ std:: env:: Args ]
2931 [ std:: env:: ArgsOs ]
30- [ * const T where T : ?Sized ]
31- [ * mut T where T : ?Sized ]
32- [ std:: ptr:: NonNull <T > where T : ?Sized ]
32+ [ * const T where T : ?Sized + PointeeSized ]
33+ [ * mut T where T : ?Sized + PointeeSized ]
34+ [ std:: ptr:: NonNull <T > where T : ?Sized + PointeeSized ]
3335 [ std:: rc:: Rc <T , A > where T : ?Sized , A : Allocator ]
3436 [ std:: rc:: Weak <T , A > where T : ?Sized , A : Allocator ]
3537 [ std:: sync:: MutexGuard <' _, T > where T : ?Sized ]
@@ -100,12 +102,12 @@ macro_rules! impls_dyn_sync_neg {
100102impls_dyn_sync_neg ! (
101103 [ std:: env:: Args ]
102104 [ std:: env:: ArgsOs ]
103- [ * const T where T : ?Sized ]
104- [ * mut T where T : ?Sized ]
105+ [ * const T where T : ?Sized + PointeeSized ]
106+ [ * mut T where T : ?Sized + PointeeSized ]
105107 [ std:: cell:: Cell <T > where T : ?Sized ]
106108 [ std:: cell:: RefCell <T > where T : ?Sized ]
107109 [ std:: cell:: UnsafeCell <T > where T : ?Sized ]
108- [ std:: ptr:: NonNull <T > where T : ?Sized ]
110+ [ std:: ptr:: NonNull <T > where T : ?Sized + PointeeSized ]
109111 [ std:: rc:: Rc <T , A > where T : ?Sized , A : Allocator ]
110112 [ std:: rc:: Weak <T , A > where T : ?Sized , A : Allocator ]
111113 [ std:: cell:: OnceCell <T > where T ]
@@ -175,10 +177,10 @@ impl_dyn_sync!(
175177 [ thin_vec:: ThinVec <T > where T : DynSync ]
176178) ;
177179
178- pub fn assert_dyn_sync < T : ?Sized + DynSync > ( ) { }
179- pub fn assert_dyn_send < T : ?Sized + DynSend > ( ) { }
180- pub fn assert_dyn_send_val < T : ?Sized + DynSend > ( _t : & T ) { }
181- pub fn assert_dyn_send_sync_val < T : ?Sized + DynSync + DynSend > ( _t : & T ) { }
180+ pub fn assert_dyn_sync < T : ?Sized + PointeeSized + DynSync > ( ) { }
181+ pub fn assert_dyn_send < T : ?Sized + PointeeSized + DynSend > ( ) { }
182+ pub fn assert_dyn_send_val < T : ?Sized + PointeeSized + DynSend > ( _t : & T ) { }
183+ pub fn assert_dyn_send_sync_val < T : ?Sized + PointeeSized + DynSync + DynSend > ( _t : & T ) { }
182184
183185#[ derive( Copy , Clone ) ]
184186pub struct FromDyn < T > ( T ) ;
@@ -231,10 +233,10 @@ impl<T> std::ops::DerefMut for FromDyn<T> {
231233// an instance of `DynSend` and `DynSync`, since the compiler cannot infer
232234// it automatically in some cases. (e.g. Box<dyn Send / Sync>)
233235#[ derive( Copy , Clone ) ]
234- pub struct IntoDynSyncSend < T : ?Sized > ( pub T ) ;
236+ pub struct IntoDynSyncSend < T : ?Sized + PointeeSized > ( pub T ) ;
235237
236- unsafe impl < T : ?Sized + Send > DynSend for IntoDynSyncSend < T > { }
237- unsafe impl < T : ?Sized + Sync > DynSync for IntoDynSyncSend < T > { }
238+ unsafe impl < T : ?Sized + PointeeSized + Send > DynSend for IntoDynSyncSend < T > { }
239+ unsafe impl < T : ?Sized + PointeeSized + Sync > DynSync for IntoDynSyncSend < T > { }
238240
239241impl < T > std:: ops:: Deref for IntoDynSyncSend < T > {
240242 type Target = T ;
0 commit comments