11use rustc_data_structures:: fx:: FxIndexSet ;
22use rustc_data_structures:: transitive_relation:: TransitiveRelationBuilder ;
3- use rustc_middle:: bug;
4- use rustc_middle:: ty:: { self , Region } ;
5- use tracing:: { debug, instrument} ;
3+ use rustc_middle:: { bug, ty} ;
4+ use tracing:: debug;
65
76use super :: explicit_outlives_bounds;
87use crate :: infer:: GenericKind ;
@@ -54,94 +53,44 @@ pub struct OutlivesEnvironment<'tcx> {
5453 region_bound_pairs : RegionBoundPairs < ' tcx > ,
5554}
5655
57- /// Builder of OutlivesEnvironment.
58- #[ derive( Debug ) ]
59- struct OutlivesEnvironmentBuilder < ' tcx > {
60- param_env : ty:: ParamEnv < ' tcx > ,
61- region_relation : TransitiveRelationBuilder < Region < ' tcx > > ,
62- region_bound_pairs : RegionBoundPairs < ' tcx > ,
63- }
64-
6556/// "Region-bound pairs" tracks outlives relations that are known to
6657/// be true, either because of explicit where-clauses like `T: 'a` or
6758/// because of implied bounds.
6859pub type RegionBoundPairs < ' tcx > = FxIndexSet < ty:: OutlivesPredicate < ' tcx , GenericKind < ' tcx > > > ;
6960
7061impl < ' tcx > OutlivesEnvironment < ' tcx > {
71- /// Create a builder using `ParamEnv` and add explicit outlives bounds into it.
72- fn builder ( param_env : ty:: ParamEnv < ' tcx > ) -> OutlivesEnvironmentBuilder < ' tcx > {
73- let mut builder = OutlivesEnvironmentBuilder {
74- param_env,
75- region_relation : Default :: default ( ) ,
76- region_bound_pairs : Default :: default ( ) ,
77- } ;
78-
79- builder. add_outlives_bounds ( explicit_outlives_bounds ( param_env) ) ;
80-
81- builder
82- }
83-
84- #[ inline]
8562 /// Create a new `OutlivesEnvironment` without extra outlives bounds.
63+ #[ inline]
8664 pub fn new ( param_env : ty:: ParamEnv < ' tcx > ) -> Self {
87- Self :: builder ( param_env) . build ( )
65+ Self :: with_bounds ( param_env, vec ! [ ] )
8866 }
8967
9068 /// Create a new `OutlivesEnvironment` with extra outlives bounds.
9169 pub fn with_bounds (
9270 param_env : ty:: ParamEnv < ' tcx > ,
9371 extra_bounds : impl IntoIterator < Item = OutlivesBound < ' tcx > > ,
9472 ) -> Self {
95- let mut builder = Self :: builder ( param_env) ;
96- builder. add_outlives_bounds ( extra_bounds) ;
97- builder. build ( )
98- }
73+ let mut region_relation = TransitiveRelationBuilder :: default ( ) ;
74+ let mut region_bound_pairs = RegionBoundPairs :: default ( ) ;
9975
100- /// Borrows current value of the `free_region_map`.
101- pub fn free_region_map ( & self ) -> & FreeRegionMap < ' tcx > {
102- & self . free_region_map
103- }
104-
105- /// Borrows current `region_bound_pairs`.
106- pub fn region_bound_pairs ( & self ) -> & RegionBoundPairs < ' tcx > {
107- & self . region_bound_pairs
108- }
109- }
110-
111- impl < ' tcx > OutlivesEnvironmentBuilder < ' tcx > {
112- #[ inline]
113- #[ instrument( level = "debug" ) ]
114- fn build ( self ) -> OutlivesEnvironment < ' tcx > {
115- OutlivesEnvironment {
116- param_env : self . param_env ,
117- free_region_map : FreeRegionMap { relation : self . region_relation . freeze ( ) } ,
118- region_bound_pairs : self . region_bound_pairs ,
119- }
120- }
121-
122- /// Processes outlives bounds that are known to hold, whether from implied or other sources.
123- fn add_outlives_bounds < I > ( & mut self , outlives_bounds : I )
124- where
125- I : IntoIterator < Item = OutlivesBound < ' tcx > > ,
126- {
12776 // Record relationships such as `T:'x` that don't go into the
12877 // free-region-map but which we use here.
129- for outlives_bound in outlives_bounds {
78+ for outlives_bound in explicit_outlives_bounds ( param_env ) . chain ( extra_bounds ) {
13079 debug ! ( "add_outlives_bounds: outlives_bound={:?}" , outlives_bound) ;
13180 match outlives_bound {
13281 OutlivesBound :: RegionSubParam ( r_a, param_b) => {
133- self . region_bound_pairs
82+ region_bound_pairs
13483 . insert ( ty:: OutlivesPredicate ( GenericKind :: Param ( param_b) , r_a) ) ;
13584 }
13685 OutlivesBound :: RegionSubAlias ( r_a, alias_b) => {
137- self . region_bound_pairs
86+ region_bound_pairs
13887 . insert ( ty:: OutlivesPredicate ( GenericKind :: Alias ( alias_b) , r_a) ) ;
13988 }
14089 OutlivesBound :: RegionSubRegion ( r_a, r_b) => match ( * r_a, * r_b) {
14190 (
14291 ty:: ReStatic | ty:: ReEarlyParam ( _) | ty:: ReLateParam ( _) ,
14392 ty:: ReStatic | ty:: ReEarlyParam ( _) | ty:: ReLateParam ( _) ,
144- ) => self . region_relation . add ( r_a, r_b) ,
93+ ) => region_relation. add ( r_a, r_b) ,
14594 ( ty:: ReError ( _) , _) | ( _, ty:: ReError ( _) ) => { }
14695 // FIXME(#109628): We shouldn't have existential variables in implied bounds.
14796 // Panic here once the linked issue is resolved!
@@ -150,5 +99,21 @@ impl<'tcx> OutlivesEnvironmentBuilder<'tcx> {
15099 } ,
151100 }
152101 }
102+
103+ OutlivesEnvironment {
104+ param_env,
105+ free_region_map : FreeRegionMap { relation : region_relation. freeze ( ) } ,
106+ region_bound_pairs,
107+ }
108+ }
109+
110+ /// Borrows current value of the `free_region_map`.
111+ pub fn free_region_map ( & self ) -> & FreeRegionMap < ' tcx > {
112+ & self . free_region_map
113+ }
114+
115+ /// Borrows current `region_bound_pairs`.
116+ pub fn region_bound_pairs ( & self ) -> & RegionBoundPairs < ' tcx > {
117+ & self . region_bound_pairs
153118 }
154119}
0 commit comments