@@ -62,7 +62,7 @@ pub struct RegionTracker {
62
62
/// The representative Region Variable Id for this SCC. We prefer
63
63
/// placeholders over existentially quantified variables, otherwise
64
64
/// it's the one with the smallest Region Variable ID.
65
- representative : RegionVid ,
65
+ pub ( crate ) representative : RegionVid ,
66
66
67
67
/// Is the current representative a placeholder?
68
68
representative_is_placeholder : bool ,
@@ -97,7 +97,7 @@ impl scc::Annotation for RegionTracker {
97
97
}
98
98
99
99
impl RegionTracker {
100
- fn new ( rvid : RegionVid , definition : & RegionDefinition < ' _ > ) -> Self {
100
+ pub ( crate ) fn new ( rvid : RegionVid , definition : & RegionDefinition < ' _ > ) -> Self {
101
101
let ( representative_is_placeholder, representative_is_existential) = match definition. origin
102
102
{
103
103
rustc_infer:: infer:: NllRegionVariableOrigin :: FreeRegion => ( false , false ) ,
@@ -132,7 +132,7 @@ impl RegionTracker {
132
132
133
133
/// Returns `true` if during the annotated SCC reaches a placeholder
134
134
/// with a universe larger than the smallest reachable one, `false` otherwise.
135
- pub fn has_incompatible_universes ( & self ) -> bool {
135
+ pub ( crate ) fn has_incompatible_universes ( & self ) -> bool {
136
136
self . universe ( ) . cannot_name ( self . max_placeholder_universe_reached )
137
137
}
138
138
}
@@ -163,7 +163,7 @@ pub struct RegionInferenceContext<'tcx> {
163
163
/// The SCC computed from `constraints` and the constraint
164
164
/// graph. We have an edge from SCC A to SCC B if `A: B`. Used to
165
165
/// compute the values of each region.
166
- constraint_sccs : Rc < ConstraintSccs > ,
166
+ constraint_sccs : ConstraintSccs ,
167
167
168
168
/// Reverse of the SCC constraint graph -- i.e., an edge `A -> B` exists if
169
169
/// `B: A`. This is used to compute the universal regions that are required
@@ -401,7 +401,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
401
401
universal_regions : Rc < UniversalRegions < ' tcx > > ,
402
402
placeholder_indices : Rc < PlaceholderIndices > ,
403
403
universal_region_relations : Frozen < UniversalRegionRelations < ' tcx > > ,
404
- outlives_constraints : OutlivesConstraintSet < ' tcx > ,
404
+ mut outlives_constraints : OutlivesConstraintSet < ' tcx > ,
405
405
member_constraints_in : MemberConstraintSet < ' tcx , RegionVid > ,
406
406
universe_causes : FxIndexMap < ty:: UniverseIndex , UniverseInfo < ' tcx > > ,
407
407
type_tests : Vec < TypeTest < ' tcx > > ,
@@ -419,17 +419,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
419
419
. map ( |info| RegionDefinition :: new ( info. universe , info. origin ) )
420
420
. collect ( ) ;
421
421
422
- let fr_static = universal_regions. fr_static ;
422
+ let constraint_sccs =
423
+ outlives_constraints. add_outlives_static ( & universal_regions, & definitions) ;
423
424
let constraints = Frozen :: freeze ( outlives_constraints) ;
424
425
let constraint_graph = Frozen :: freeze ( constraints. graph ( definitions. len ( ) ) ) ;
425
- let constraint_sccs = {
426
- let constraint_graph = constraints. graph ( definitions. len ( ) ) ;
427
- let region_graph = & constraint_graph. region_graph ( & constraints, fr_static) ;
428
- let sccs = ConstraintSccs :: new_with_annotation ( & region_graph, |r| {
429
- RegionTracker :: new ( r, & definitions[ r] )
430
- } ) ;
431
- Rc :: new ( sccs)
432
- } ;
433
426
434
427
if cfg ! ( debug_assertions) {
435
428
sccs_info ( infcx, & constraint_sccs) ;
@@ -548,21 +541,7 @@ impl<'tcx> RegionInferenceContext<'tcx> {
548
541
}
549
542
550
543
NllRegionVariableOrigin :: Placeholder ( placeholder) => {
551
- // Each placeholder region is only visible from
552
- // its universe `ui` and its extensions. So we
553
- // can't just add it into `scc` unless the
554
- // universe of the scc can name this region.
555
- let scc_universe = self . scc_universe ( scc) ;
556
- if scc_universe. can_name ( placeholder. universe ) {
557
- self . scc_values . add_element ( scc, placeholder) ;
558
- } else {
559
- debug ! (
560
- "init_free_and_bound_regions: placeholder {:?} is \
561
- not compatible with universe {:?} of its SCC {:?}",
562
- placeholder, scc_universe, scc,
563
- ) ;
564
- self . add_incompatible_universe ( scc) ;
565
- }
544
+ self . scc_values . add_element ( scc, placeholder) ;
566
545
}
567
546
568
547
NllRegionVariableOrigin :: Existential { .. } => {
@@ -744,23 +723,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
744
723
/// (which is assured by iterating over SCCs in dependency order).
745
724
#[ instrument( skip( self ) , level = "debug" ) ]
746
725
fn compute_value_for_scc ( & mut self , scc_a : ConstraintSccIndex ) {
747
- let constraint_sccs = self . constraint_sccs . clone ( ) ;
748
-
749
726
// Walk each SCC `B` such that `A: B`...
750
- for & scc_b in constraint_sccs. successors ( scc_a) {
727
+ for & scc_b in self . constraint_sccs . successors ( scc_a) {
751
728
debug ! ( ?scc_b) ;
752
-
753
- // ...and add elements from `B` into `A`. One complication
754
- // arises because of universes: If `B` contains something
755
- // that `A` cannot name, then `A` can only contain `B` if
756
- // it outlives static.
757
- if self . universe_compatible ( scc_b, scc_a) {
758
- // `A` can name everything that is in `B`, so just
759
- // merge the bits.
760
- self . scc_values . add_region ( scc_a, scc_b) ;
761
- } else {
762
- self . add_incompatible_universe ( scc_a) ;
763
- }
729
+ self . scc_values . add_region ( scc_a, scc_b) ;
764
730
}
765
731
766
732
// Now take member constraints into account.
@@ -886,35 +852,20 @@ impl<'tcx> RegionInferenceContext<'tcx> {
886
852
/// in `scc_a`. Used during constraint propagation, and only once
887
853
/// the value of `scc_b` has been computed.
888
854
fn universe_compatible ( & self , scc_b : ConstraintSccIndex , scc_a : ConstraintSccIndex ) -> bool {
889
- let universe_a = self . constraint_sccs ( ) . annotation ( scc_a) . universe ( ) ;
890
- let universe_b = self . constraint_sccs ( ) . annotation ( scc_b) . universe ( ) ;
855
+ let a_annotation = self . constraint_sccs ( ) . annotation ( scc_a) ;
856
+ let b_annotation = self . constraint_sccs ( ) . annotation ( scc_b) ;
857
+ let a_universe = a_annotation. universe ( ) ;
891
858
892
- // Quick check: if scc_b's declared universe is a subset of
859
+ // If scc_b's declared universe is a subset of
893
860
// scc_a's declared universe (typically, both are ROOT), then
894
861
// it cannot contain any problematic universe elements.
895
- if universe_a . can_name ( universe_b ) {
862
+ if a_universe . can_name ( b_annotation . universe ( ) ) {
896
863
return true ;
897
864
}
898
865
899
- // Otherwise, we have to iterate over the universe elements in
900
- // B's value, and check whether all of them are nameable
901
- // from universe_a
902
- self . scc_values . placeholders_contained_in ( scc_b) . all ( |p| universe_a. can_name ( p. universe ) )
903
- }
904
-
905
- /// Extend `scc` so that it can outlive some placeholder region
906
- /// from a universe it can't name; at present, the only way for
907
- /// this to be true is if `scc` outlives `'static`. This is
908
- /// actually stricter than necessary: ideally, we'd support bounds
909
- /// like `for<'a: 'b>` that might then allow us to approximate
910
- /// `'a` with `'b` and not `'static`. But it will have to do for
911
- /// now.
912
- fn add_incompatible_universe ( & mut self , scc : ConstraintSccIndex ) {
913
- debug ! ( "add_incompatible_universe(scc={:?})" , scc) ;
914
-
915
- let fr_static = self . universal_regions . fr_static ;
916
- self . scc_values . add_all_points ( scc) ;
917
- self . scc_values . add_element ( scc, fr_static) ;
866
+ // Otherwise, there can be no placeholder in `b` with a too high
867
+ // universe index to name from `a`.
868
+ a_universe. can_name ( b_annotation. max_placeholder_universe_reached )
918
869
}
919
870
920
871
/// Once regions have been propagated, this method is used to see
@@ -1896,6 +1847,10 @@ impl<'tcx> RegionInferenceContext<'tcx> {
1896
1847
1897
1848
// This loop can be hot.
1898
1849
for constraint in outgoing_edges_from_graph {
1850
+ if matches ! ( constraint. category, ConstraintCategory :: IllegalUniverse ) {
1851
+ debug ! ( "Ignoring illegal universe constraint: {constraint:?}" ) ;
1852
+ continue ;
1853
+ }
1899
1854
handle_constraint ( constraint) ;
1900
1855
}
1901
1856
0 commit comments