@@ -11,7 +11,9 @@ use crate::constraints::ConstraintSccIndex;
1111use crate :: handle_placeholders:: { SccAnnotations , region_definitions} ;
1212use crate :: region_infer:: reverse_sccs:: ReverseSccGraph ;
1313use crate :: region_infer:: values:: RegionValues ;
14- use crate :: region_infer:: { ConstraintSccs , RegionDefinition , RegionTracker , Representative } ;
14+ use crate :: region_infer:: {
15+ ConstraintSccs , OutlivesConstraintSet , RegionDefinition , RegionTracker , Representative ,
16+ } ;
1517use crate :: type_check:: MirTypeckRegionConstraints ;
1618use crate :: type_check:: free_region_relations:: UniversalRegionRelations ;
1719use crate :: universal_regions:: UniversalRegions ;
@@ -39,16 +41,36 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
3941 location_map : Rc < DenseLocationMap > ,
4042 constraints : & MirTypeckRegionConstraints < ' tcx > ,
4143 ) -> RegionCtxt < ' a , ' tcx > {
44+ let mut outlives_constraints = constraints. outlives_constraints . clone ( ) ;
4245 let universal_regions = & universal_region_relations. universal_regions ;
4346 let ( definitions, _has_placeholders) = region_definitions ( infcx, universal_regions) ;
47+
48+ let compute_sccs =
49+ |outlives_constraints : & OutlivesConstraintSet < ' tcx > ,
50+ annotations : & mut SccAnnotations < ' _ , ' tcx , RegionTracker > | {
51+ ConstraintSccs :: new_with_annotation (
52+ & outlives_constraints
53+ . graph ( definitions. len ( ) )
54+ . region_graph ( outlives_constraints, universal_regions. fr_static ) ,
55+ annotations,
56+ )
57+ } ;
58+
4459 let mut scc_annotations = SccAnnotations :: init ( & definitions) ;
45- let constraint_sccs = ConstraintSccs :: new_with_annotation (
46- & constraints
47- . outlives_constraints
48- . graph ( definitions. len ( ) )
49- . region_graph ( & constraints. outlives_constraints , universal_regions. fr_static ) ,
50- & mut scc_annotations,
60+ let mut constraint_sccs = compute_sccs ( & outlives_constraints, & mut scc_annotations) ;
61+
62+ let added_constraints = crate :: handle_placeholders:: rewrite_placeholder_outlives (
63+ & constraint_sccs,
64+ & scc_annotations,
65+ universal_regions. fr_static ,
66+ & mut outlives_constraints,
5167 ) ;
68+
69+ if added_constraints {
70+ scc_annotations = SccAnnotations :: init ( & definitions) ;
71+ constraint_sccs = compute_sccs ( & outlives_constraints, & mut scc_annotations) ;
72+ }
73+
5274 let scc_annotations = scc_annotations. scc_to_annotation ;
5375
5476 // Unlike the `RegionInferenceContext`, we only care about free regions
0 commit comments