@@ -39,7 +39,9 @@ use rustc_data_structures::profiling::SelfProfilerRef;
3939use rustc_data_structures:: sharded:: { IntoPointer , ShardedHashMap } ;
4040use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
4141use rustc_data_structures:: steal:: Steal ;
42- use rustc_data_structures:: sync:: { FreezeReadGuard , Lock , WorkerLocal } ;
42+ use rustc_data_structures:: sync:: { self , FreezeReadGuard , Lock , WorkerLocal } ;
43+ #[ cfg( parallel_compiler) ]
44+ use rustc_data_structures:: sync:: { DynSend , DynSync } ;
4345use rustc_data_structures:: unord:: UnordSet ;
4446use rustc_errors:: {
4547 DecorateLint , DiagnosticBuilder , DiagnosticMessage , ErrorGuaranteed , MultiSpan ,
@@ -552,6 +554,16 @@ pub struct TyCtxt<'tcx> {
552554 gcx : & ' tcx GlobalCtxt < ' tcx > ,
553555}
554556
557+ // Explicitly implement `DynSync` and `DynSend` for `TyCtxt` to short circuit trait resolution.
558+ #[ cfg( parallel_compiler) ]
559+ unsafe impl DynSend for TyCtxt < ' _ > { }
560+ #[ cfg( parallel_compiler) ]
561+ unsafe impl DynSync for TyCtxt < ' _ > { }
562+ fn _assert_tcx_fields ( ) {
563+ sync:: assert_dyn_sync :: < & ' _ GlobalCtxt < ' _ > > ( ) ;
564+ sync:: assert_dyn_send :: < & ' _ GlobalCtxt < ' _ > > ( ) ;
565+ }
566+
555567impl < ' tcx > Deref for TyCtxt < ' tcx > {
556568 type Target = & ' tcx GlobalCtxt < ' tcx > ;
557569 #[ inline( always) ]
0 commit comments