@@ -40,6 +40,8 @@ use rustc_data_structures::sharded::{IntoPointer, ShardedHashMap};
40
40
use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
41
41
use rustc_data_structures:: steal:: Steal ;
42
42
use rustc_data_structures:: sync:: { FreezeReadGuard , Lock , WorkerLocal } ;
43
+ #[ cfg( parallel_compiler) ]
44
+ use rustc_data_structures:: sync:: { self , DynSend , DynSync } ;
43
45
use rustc_data_structures:: unord:: UnordSet ;
44
46
use rustc_errors:: {
45
47
DecorateLint , DiagnosticBuilder , DiagnosticMessage , ErrorGuaranteed , MultiSpan ,
@@ -517,6 +519,16 @@ pub struct TyCtxt<'tcx> {
517
519
gcx : & ' tcx GlobalCtxt < ' tcx > ,
518
520
}
519
521
522
+ // Explicitly implement `DynSync` and `DynSend` for `TyCtxt` to short circuit trait resolution.
523
+ #[ cfg( parallel_compiler) ]
524
+ unsafe impl DynSend for TyCtxt < ' _ > { }
525
+ #[ cfg( parallel_compiler) ]
526
+ unsafe impl DynSync for TyCtxt < ' _ > { }
527
+ fn _assert_tcx_fields ( ) {
528
+ sync:: assert_dyn_sync :: < & ' _ GlobalCtxt < ' _ > > ( ) ;
529
+ sync:: assert_dyn_send :: < & ' _ GlobalCtxt < ' _ > > ( ) ;
530
+ }
531
+
520
532
impl < ' tcx > Deref for TyCtxt < ' tcx > {
521
533
type Target = & ' tcx GlobalCtxt < ' tcx > ;
522
534
#[ inline( always) ]
0 commit comments