1- // ignore-tidy-filelength 
2- 
31//! Type context book-keeping. 
42
53use  crate :: arena:: Arena ; 
@@ -67,7 +65,6 @@ use std::ops::{Deref, Bound};
6765use  std:: iter; 
6866use  std:: sync:: mpsc; 
6967use  std:: sync:: Arc ; 
70- use  std:: marker:: PhantomData ; 
7168use  rustc_target:: spec:: abi; 
7269use  rustc_macros:: HashStable ; 
7370use  syntax:: ast; 
@@ -81,14 +78,12 @@ use crate::hir;
8178
8279pub  struct  AllArenas  { 
8380    pub  interner :  SyncDroplessArena , 
84-     pub  local_interner :  SyncDroplessArena , 
8581} 
8682
8783impl  AllArenas  { 
8884    pub  fn  new ( )  -> Self  { 
8985        AllArenas  { 
9086            interner :  SyncDroplessArena :: default ( ) , 
91-             local_interner :  SyncDroplessArena :: default ( ) , 
9287        } 
9388    } 
9489} 
@@ -136,57 +131,21 @@ impl<'tcx> CtxtInterners<'tcx> {
136131
137132    /// Intern a type 
138133     #[ inline( never) ]  
139-     fn  intern_ty ( 
140-         local :  & CtxtInterners < ' tcx > , 
141-         global :  & CtxtInterners < ' tcx > , 
142-         st :  TyKind < ' tcx > , 
134+     fn  intern_ty ( & self , 
135+         st :  TyKind < ' tcx > 
143136    )  -> Ty < ' tcx >  { 
144-         let  flags = super :: flags:: FlagComputation :: for_sty ( & st) ; 
145- 
146-         // HACK(eddyb) Depend on flags being accurate to 
147-         // determine that all contents are in the global tcx. 
148-         // See comments on Lift for why we can't use that. 
149-         if  flags. flags . intersects ( ty:: TypeFlags :: KEEP_IN_LOCAL_TCX )  { 
150-             local. type_ . borrow_mut ( ) . intern ( st,  |st| { 
151-                 let  ty_struct = TyS  { 
152-                     sty :  st, 
153-                     flags :  flags. flags , 
154-                     outer_exclusive_binder :  flags. outer_exclusive_binder , 
155-                 } ; 
137+         self . type_ . borrow_mut ( ) . intern ( st,  |st| { 
138+             let  flags = super :: flags:: FlagComputation :: for_sty ( & st) ; 
156139
157-                 // Make sure we don't end up with inference 
158-                 // types/regions in the global interner 
159-                 if  ptr_eq ( local,  global)  { 
160-                     bug ! ( "Attempted to intern `{:?}` which contains \  
161-                          inference types/regions in the global type context", 
162-                         & ty_struct) ; 
163-                 } 
164- 
165-                 // This is safe because all the types the ty_struct can point to 
166-                 // already is in the local arena or the global arena 
167-                 let  ty_struct:  TyS < ' tcx >  = unsafe  { 
168-                     mem:: transmute ( ty_struct) 
169-                 } ; 
170- 
171-                 Interned ( local. arena . alloc ( ty_struct) ) 
172-             } ) . 0 
173-         }  else  { 
174-             global. type_ . borrow_mut ( ) . intern ( st,  |st| { 
175-                 let  ty_struct = TyS  { 
176-                     sty :  st, 
177-                     flags :  flags. flags , 
178-                     outer_exclusive_binder :  flags. outer_exclusive_binder , 
179-                 } ; 
140+             let  ty_struct = TyS  { 
141+                 sty :  st, 
142+                 flags :  flags. flags , 
143+                 outer_exclusive_binder :  flags. outer_exclusive_binder , 
144+             } ; 
180145
181-                 // This is safe because all the types the ty_struct can point to 
182-                 // already is in the global arena 
183-                 let  ty_struct:  TyS < ' tcx >  = unsafe  { 
184-                     mem:: transmute ( ty_struct) 
185-                 } ; 
186146
187-                 Interned ( global. arena . alloc ( ty_struct) ) 
188-             } ) . 0 
189-         } 
147+             Interned ( self . arena . alloc ( ty_struct) ) 
148+         } ) . 0 
190149    } 
191150} 
192151
@@ -933,7 +892,7 @@ EnumLiftImpl! {
933892
934893impl < ' tcx >  CommonTypes < ' tcx >  { 
935894    fn  new ( interners :  & CtxtInterners < ' tcx > )  -> CommonTypes < ' tcx >  { 
936-         let  mk = |sty| CtxtInterners :: intern_ty ( interners ,  interners ,   sty) ; 
895+         let  mk = |sty| interners . intern_ty ( sty) ; 
937896
938897        CommonTypes  { 
939898            unit :  mk ( Tuple ( List :: empty ( ) ) ) , 
@@ -1015,8 +974,6 @@ pub struct FreeRegionInfo {
1015974#[ derive( Copy ,  Clone ) ]  
1016975pub  struct  TyCtxt < ' tcx >  { 
1017976    gcx :  & ' tcx  GlobalCtxt < ' tcx > , 
1018-     interners :  & ' tcx  CtxtInterners < ' tcx > , 
1019-     dummy :  PhantomData < & ' tcx  ( ) > , 
1020977} 
1021978
1022979impl < ' tcx >  Deref  for  TyCtxt < ' tcx >  { 
@@ -1030,8 +987,7 @@ impl<'tcx> Deref for TyCtxt<'tcx> {
1030987pub  struct  GlobalCtxt < ' tcx >  { 
1031988    pub  arena :  WorkerLocal < Arena < ' tcx > > , 
1032989
1033-     global_interners :  CtxtInterners < ' tcx > , 
1034-     local_interners :  CtxtInterners < ' tcx > , 
990+     interners :  CtxtInterners < ' tcx > , 
1035991
1036992    cstore :  & ' tcx  CrateStoreDyn , 
1037993
@@ -1122,8 +1078,6 @@ impl<'tcx> TyCtxt<'tcx> {
11221078    pub  fn  global_tcx ( self )  -> TyCtxt < ' tcx >  { 
11231079        TyCtxt  { 
11241080            gcx :  self . gcx , 
1125-             interners :  & self . gcx . global_interners , 
1126-             dummy :  PhantomData , 
11271081        } 
11281082    } 
11291083
@@ -1203,11 +1157,6 @@ impl<'tcx> TyCtxt<'tcx> {
12031157        value. lift_to_tcx ( self . global_tcx ( ) ) 
12041158    } 
12051159
1206-     /// Returns `true` if self is the same as self.global_tcx(). 
1207-      fn  is_global ( self )  -> bool  { 
1208-         ptr_eq ( self . interners ,  & self . global_interners ) 
1209-     } 
1210- 
12111160    /// Creates a type context and call the closure with a `TyCtxt` reference 
12121161     /// to the context. The closure enforces that the type context and any interned 
12131162     /// value (types, substs, etc.) can only be used while `ty::tls` has a valid 
@@ -1229,7 +1178,6 @@ impl<'tcx> TyCtxt<'tcx> {
12291178            s. fatal ( & err) ; 
12301179        } ) ; 
12311180        let  interners = CtxtInterners :: new ( & arenas. interner ) ; 
1232-         let  local_interners = CtxtInterners :: new ( & arenas. local_interner ) ; 
12331181        let  common = Common  { 
12341182            empty_predicates :  ty:: GenericPredicates  { 
12351183                parent :  None , 
@@ -1287,8 +1235,7 @@ impl<'tcx> TyCtxt<'tcx> {
12871235            sess :  s, 
12881236            cstore, 
12891237            arena :  WorkerLocal :: new ( |_| Arena :: default ( ) ) , 
1290-             global_interners :  interners, 
1291-             local_interners :  local_interners, 
1238+             interners, 
12921239            dep_graph, 
12931240            common, 
12941241            types :  common_types, 
@@ -1682,8 +1629,6 @@ impl<'tcx> GlobalCtxt<'tcx> {
16821629    { 
16831630        let  tcx = TyCtxt  { 
16841631            gcx :  self , 
1685-             interners :  & self . local_interners , 
1686-             dummy :  PhantomData , 
16871632        } ; 
16881633        ty:: tls:: with_related_context ( tcx. global_tcx ( ) ,  |icx| { 
16891634            let  new_icx = ty:: tls:: ImplicitCtxt  { 
@@ -1729,11 +1674,7 @@ macro_rules! nop_lift {
17291674                    type  Lifted  = $lifted; 
17301675                    fn  lift_to_tcx( & self ,  tcx:  TyCtxt <' tcx>)  -> Option <Self :: Lifted > { 
17311676                        if  tcx. interners. arena. in_arena( * self  as  * const  _)  { 
1732-                             return  Some ( unsafe  {  mem:: transmute( * self )  } ) ; 
1733-                         } 
1734-                         // Also try in the global tcx if we're not that. 
1735-                         if  !tcx. is_global( )  { 
1736-                             self . lift_to_tcx( tcx. global_tcx( ) ) 
1677+                             Some ( unsafe  {  mem:: transmute( * self )  } ) 
17371678                        }  else { 
17381679                            None 
17391680                        } 
@@ -1751,11 +1692,7 @@ macro_rules! nop_list_lift {
17511692                            return  Some ( List :: empty( ) ) ; 
17521693                        } 
17531694                        if  tcx. interners. arena. in_arena( * self  as  * const  _)  { 
1754-                             return  Some ( unsafe  {  mem:: transmute( * self )  } ) ; 
1755-                         } 
1756-                         // Also try in the global tcx if we're not that. 
1757-                         if  !tcx. is_global( )  { 
1758-                             self . lift_to_tcx( tcx. global_tcx( ) ) 
1695+                             Some ( unsafe  {  mem:: transmute( * self )  } ) 
17591696                        }  else { 
17601697                            None 
17611698                        } 
@@ -1785,7 +1722,6 @@ pub mod tls {
17851722
17861723    use  std:: fmt; 
17871724    use  std:: mem; 
1788-     use  std:: marker:: PhantomData ; 
17891725    use  syntax_pos; 
17901726    use  crate :: ty:: query; 
17911727    use  errors:: { Diagnostic ,  TRACK_DIAGNOSTICS } ; 
@@ -1949,8 +1885,6 @@ pub mod tls {
19491885
19501886        let  tcx = TyCtxt  { 
19511887            gcx, 
1952-             interners :  & gcx. global_interners , 
1953-             dummy :  PhantomData , 
19541888        } ; 
19551889        let  icx = ImplicitCtxt  { 
19561890            tcx, 
@@ -1981,8 +1915,6 @@ pub mod tls {
19811915        let  gcx = & * ( gcx as  * const  GlobalCtxt < ' _ > ) ; 
19821916        let  tcx = TyCtxt  { 
19831917            gcx, 
1984-             interners :  & gcx. global_interners , 
1985-             dummy :  PhantomData , 
19861918        } ; 
19871919        let  icx = ImplicitCtxt  { 
19881920            query :  None , 
@@ -2041,26 +1973,6 @@ pub mod tls {
20411973        } ) 
20421974    } 
20431975
2044-     /// Allows access to the current ImplicitCtxt whose tcx field has the same global 
2045-      /// interner and local interner as the tcx argument passed in. This means the closure 
2046-      /// is given an ImplicitCtxt with the same 'tcx and 'tcx lifetimes as the TyCtxt passed in. 
2047-      /// This will panic if you pass it a TyCtxt which has a different global interner or 
2048-      /// a different local interner from the current ImplicitCtxt's tcx field. 
2049-      #[ inline]  
2050-     pub  fn  with_fully_related_context < ' tcx ,  F ,  R > ( tcx :  TyCtxt < ' tcx > ,  f :  F )  -> R 
2051-     where 
2052-         F :  for < ' b >  FnOnce ( & ImplicitCtxt < ' b ,  ' tcx > )  -> R , 
2053-     { 
2054-         with_context ( |context| { 
2055-             unsafe  { 
2056-                 assert ! ( ptr_eq( context. tcx. gcx,  tcx. gcx) ) ; 
2057-                 assert ! ( ptr_eq( context. tcx. interners,  tcx. interners) ) ; 
2058-                 let  context:  & ImplicitCtxt < ' _ ,  ' _ >  = mem:: transmute ( context) ; 
2059-                 f ( context) 
2060-             } 
2061-         } ) 
2062-     } 
2063- 
20641976    /// Allows access to the TyCtxt in the current ImplicitCtxt. 
20651977     /// Panics if there is no ImplicitCtxt available 
20661978     #[ inline]  
@@ -2288,39 +2200,22 @@ impl<'tcx> Borrow<[Goal<'tcx>]> for Interned<'tcx, List<Goal<'tcx>>> {
22882200macro_rules!  intern_method { 
22892201    ( $lt_tcx: tt,  $name: ident:  $method: ident( $alloc: ty, 
22902202                                            $alloc_method: expr, 
2291-                                             $alloc_to_key: expr, 
2292-                                             $keep_in_local_tcx: expr)  -> $ty: ty)  => { 
2203+                                             $alloc_to_key: expr)  -> $ty: ty)  => { 
22932204        impl <$lt_tcx> TyCtxt <$lt_tcx> { 
22942205            pub  fn  $method( self ,  v:  $alloc)  -> & $lt_tcx $ty { 
22952206                let  key = ( $alloc_to_key) ( & v) ; 
22962207
2297-                 // HACK(eddyb) Depend on flags being accurate to 
2298-                 // determine that all contents are in the global tcx. 
2299-                 // See comments on Lift for why we can't use that. 
2300-                 if  ( $keep_in_local_tcx) ( & v)  { 
2301-                     self . interners. $name. borrow_mut( ) . intern_ref( key,  || { 
2302-                         // Make sure we don't end up with inference 
2303-                         // types/regions in the global tcx. 
2304-                         if  self . is_global( )  { 
2305-                             bug!( "Attempted to intern `{:?}` which contains \  
2306-                                  inference types/regions in the global type context", 
2307-                                 v) ; 
2308-                         } 
2208+                 self . interners. $name. borrow_mut( ) . intern_ref( key,  || { 
2209+                     Interned ( $alloc_method( & self . interners. arena,  v) ) 
23092210
2310-                         Interned ( $alloc_method( & self . interners. arena,  v) ) 
2311-                     } ) . 0 
2312-                 }  else { 
2313-                     self . global_interners. $name. borrow_mut( ) . intern_ref( key,  || { 
2314-                         Interned ( $alloc_method( & self . global_interners. arena,  v) ) 
2315-                     } ) . 0 
2316-                 } 
2211+                 } ) . 0 
23172212            } 
23182213        } 
23192214    } 
23202215} 
23212216
23222217macro_rules!  direct_interners { 
2323-     ( $lt_tcx: tt,  $( $name: ident:  $method: ident( $keep_in_local_tcx : expr )  -> $ ty: ty) ,+)  => { 
2218+     ( $lt_tcx: tt,  $( $name: ident:  $method: ident( $ty: ty) ) ,+)  => { 
23242219        $( impl <$lt_tcx> PartialEq  for  Interned <$lt_tcx,  $ty> { 
23252220            fn  eq( & self ,  other:  & Self )  -> bool  { 
23262221                self . 0  == other. 0 
@@ -2339,8 +2234,7 @@ macro_rules! direct_interners {
23392234            $lt_tcx, 
23402235            $name:  $method( $ty, 
23412236                           |a:  & $lt_tcx SyncDroplessArena ,  v| -> & $lt_tcx $ty {  a. alloc( v)  } , 
2342-                            |x| x, 
2343-                            $keep_in_local_tcx)  -> $ty) ; ) +
2237+                            |x| x)  -> $ty) ; ) +
23442238    } 
23452239} 
23462240
@@ -2349,18 +2243,17 @@ pub fn keep_local<'tcx, T: ty::TypeFoldable<'tcx>>(x: &T) -> bool {
23492243} 
23502244
23512245direct_interners ! ( ' tcx, 
2352-     region:  mk_region( |r :   & RegionKind | r . keep_in_local_tcx ( ) )  ->  RegionKind , 
2353-     goal:  mk_goal( |c :   & GoalKind <' _>| keep_local ( c ) )  ->  GoalKind < ' tcx>, 
2354-     const_:  mk_const( |c :   & Const <' _>| keep_local ( & c ) )  ->  Const < ' tcx>
2246+     region:  mk_region( RegionKind ) , 
2247+     goal:  mk_goal( GoalKind <' tcx>) , 
2248+     const_:  mk_const( Const <' tcx>) 
23552249) ; 
23562250
23572251macro_rules!  slice_interners { 
23582252    ( $( $field: ident:  $method: ident( $ty: ty) ) ,+)  => ( 
23592253        $( intern_method!(  ' tcx,  $field:  $method( 
23602254            & [ $ty] , 
23612255            |a,  v| List :: from_arena( a,  v) , 
2362-             Deref :: deref, 
2363-             |xs:  & [ $ty] | xs. iter( ) . any( keep_local) )  -> List <$ty>) ; ) +
2256+             Deref :: deref)  -> List <$ty>) ; ) +
23642257    ) ; 
23652258} 
23662259
@@ -2384,8 +2277,7 @@ intern_method! {
23842277    canonical_var_infos:  _intern_canonical_var_infos( 
23852278        & [ CanonicalVarInfo ] , 
23862279        |a,  v| List :: from_arena( a,  v) , 
2387-         Deref :: deref, 
2388-         |_xs:  & [ CanonicalVarInfo ] | -> bool  {  false  } 
2280+         Deref :: deref
23892281    )  -> List <CanonicalVarInfo >
23902282} 
23912283
@@ -2431,7 +2323,7 @@ impl<'tcx> TyCtxt<'tcx> {
24312323
24322324    #[ inline]  
24332325    pub  fn  mk_ty ( & self ,  st :  TyKind < ' tcx > )  -> Ty < ' tcx >  { 
2434-         CtxtInterners :: intern_ty ( & self . interners ,   & self . global_interners ,   st) 
2326+         self . interners . intern_ty ( st) 
24352327    } 
24362328
24372329    pub  fn  mk_mach_int ( self ,  tm :  ast:: IntTy )  -> Ty < ' tcx >  { 
0 commit comments