@@ -11,7 +11,7 @@ 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:: { OutlivesConstraintSet , ConstraintSccs , RegionDefinition , RegionTracker , Representative } ;
1515use crate :: type_check:: MirTypeckRegionConstraints ;
1616use crate :: type_check:: free_region_relations:: UniversalRegionRelations ;
1717use crate :: universal_regions:: UniversalRegions ;
@@ -39,16 +39,36 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> {
3939 location_map : Rc < DenseLocationMap > ,
4040 constraints : & MirTypeckRegionConstraints < ' tcx > ,
4141 ) -> RegionCtxt < ' a , ' tcx > {
42+ let mut outlives_constraints = constraints. outlives_constraints . clone ( ) ;
4243 let universal_regions = & universal_region_relations. universal_regions ;
4344 let ( definitions, _has_placeholders) = region_definitions ( infcx, universal_regions) ;
45+
46+ let compute_sccs =
47+ |outlives_constraints : & OutlivesConstraintSet < ' tcx > ,
48+ annotations : & mut SccAnnotations < ' _ , ' tcx , RegionTracker > | {
49+ ConstraintSccs :: new_with_annotation (
50+ & outlives_constraints
51+ . graph ( definitions. len ( ) )
52+ . region_graph ( outlives_constraints, universal_regions. fr_static ) ,
53+ annotations,
54+ )
55+ } ;
56+
4457 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,
58+ let mut constraint_sccs = compute_sccs ( & outlives_constraints, & mut scc_annotations) ;
59+
60+ let added_constraints = crate :: handle_placeholders:: rewrite_placeholder_outlives (
61+ & constraint_sccs,
62+ & scc_annotations,
63+ universal_regions. fr_static ,
64+ & mut outlives_constraints,
5165 ) ;
66+
67+ if added_constraints {
68+ scc_annotations = SccAnnotations :: init ( & definitions) ;
69+ constraint_sccs = compute_sccs ( & outlives_constraints, & mut scc_annotations) ;
70+ }
71+
5272 let scc_annotations = scc_annotations. scc_to_annotation ;
5373
5474 // Unlike the `RegionInferenceContext`, we only care about free regions
0 commit comments