@@ -5,11 +5,9 @@ use rustc_index::{IndexSlice, IndexVec};
5
5
use rustc_middle:: mir:: ConstraintCategory ;
6
6
use rustc_middle:: ty:: { RegionVid , TyCtxt , VarianceDiagInfo } ;
7
7
use rustc_span:: Span ;
8
- use tracing:: { debug, instrument } ;
8
+ use tracing:: debug;
9
9
10
- use crate :: region_infer:: { AnnotatedSccs , ConstraintSccs , RegionDefinition , SccAnnotations } ;
11
10
use crate :: type_check:: Locations ;
12
- use crate :: universal_regions:: UniversalRegions ;
13
11
14
12
pub ( crate ) mod graph;
15
13
@@ -53,112 +51,6 @@ impl<'tcx> OutlivesConstraintSet<'tcx> {
53
51
) -> & IndexSlice < OutlivesConstraintIndex , OutlivesConstraint < ' tcx > > {
54
52
& self . outlives
55
53
}
56
-
57
- /// Computes cycles (SCCs) in the graph of regions. In particular,
58
- /// find all regions R1, R2 such that R1: R2 and R2: R1 and group
59
- /// them into an SCC, and find the relationships between SCCs.
60
- pub ( crate ) fn compute_sccs (
61
- & self ,
62
- static_region : RegionVid ,
63
- definitions : & IndexVec < RegionVid , RegionDefinition < ' tcx > > ,
64
- ) -> AnnotatedSccs {
65
- let constraint_graph = self . graph ( definitions. len ( ) ) ;
66
- let region_graph = & constraint_graph. region_graph ( self , static_region) ;
67
- let mut annotation_visitor = SccAnnotations :: new ( definitions) ;
68
- (
69
- ConstraintSccs :: new_with_annotation ( & region_graph, & mut annotation_visitor) ,
70
- annotation_visitor. scc_to_annotation ,
71
- )
72
- }
73
-
74
- /// This method handles Universe errors by rewriting the constraint
75
- /// graph. For each strongly connected component in the constraint
76
- /// graph such that there is a series of constraints
77
- /// A: B: C: ... : X where
78
- /// A's universe is smaller than X's and A is a placeholder,
79
- /// add a constraint that A: 'static. This is a safe upper bound
80
- /// in the face of borrow checker/trait solver limitations that will
81
- /// eventually go away.
82
- ///
83
- /// For a more precise definition, see the documentation for
84
- /// [`crate::region_infer::RegionTracker`].
85
- ///
86
- /// This edge case used to be handled during constraint propagation
87
- /// by iterating over the strongly connected components in the constraint
88
- /// graph while maintaining a set of bookkeeping mappings similar
89
- /// to what is stored in `RegionTracker` and manually adding 'static as
90
- /// needed.
91
- ///
92
- /// It was rewritten as part of the Polonius project with the goal of moving
93
- /// higher-kindedness concerns out of the path of the borrow checker,
94
- /// for two reasons:
95
- ///
96
- /// 1. Implementing Polonius is difficult enough without also
97
- /// handling them.
98
- /// 2. The long-term goal is to handle higher-kinded concerns
99
- /// in the trait solver, where they belong. This avoids
100
- /// logic duplication and allows future trait solvers
101
- /// to compute better bounds than for example our
102
- /// "must outlive 'static" here.
103
- ///
104
- /// This code is a stop-gap measure in preparation for the future trait solver.
105
- ///
106
- /// Every constraint added by this method is an
107
- /// internal `IllegalUniverse` constraint.
108
- #[ instrument( skip( self , universal_regions, definitions) ) ]
109
- pub ( crate ) fn add_outlives_static (
110
- & mut self ,
111
- universal_regions : & UniversalRegions < ' tcx > ,
112
- definitions : & IndexVec < RegionVid , RegionDefinition < ' tcx > > ,
113
- ) -> AnnotatedSccs {
114
- let fr_static = universal_regions. fr_static ;
115
- let ( sccs, annotations) = self . compute_sccs ( fr_static, definitions) ;
116
-
117
- // Changed to `true` if we added any constraints to `self` and need to
118
- // recompute SCCs.
119
- let mut added_constraints = false ;
120
-
121
- for scc in sccs. all_sccs ( ) {
122
- // No point in adding 'static: 'static!
123
- // This micro-optimisation makes somewhat sense
124
- // because static outlives *everything*.
125
- if scc == sccs. scc ( fr_static) {
126
- continue ;
127
- }
128
-
129
- let annotation = annotations[ scc] ;
130
-
131
- // If this SCC participates in a universe violation,
132
- // e.g. if it reaches a region with a universe smaller than
133
- // the largest region reached, add a requirement that it must
134
- // outlive `'static`.
135
- if annotation. has_incompatible_universes ( ) {
136
- // Optimisation opportunity: this will add more constraints than
137
- // needed for correctness, since an SCC upstream of another with
138
- // a universe violation will "infect" its downstream SCCs to also
139
- // outlive static.
140
- added_constraints = true ;
141
- let scc_representative_outlives_static = OutlivesConstraint {
142
- sup : annotation. representative ,
143
- sub : fr_static,
144
- category : ConstraintCategory :: IllegalUniverse ,
145
- locations : Locations :: All ( rustc_span:: DUMMY_SP ) ,
146
- span : rustc_span:: DUMMY_SP ,
147
- variance_info : VarianceDiagInfo :: None ,
148
- from_closure : false ,
149
- } ;
150
- self . push ( scc_representative_outlives_static) ;
151
- }
152
- }
153
-
154
- if added_constraints {
155
- // We changed the constraint set and so must recompute SCCs.
156
- self . compute_sccs ( fr_static, definitions)
157
- } else {
158
- // If we didn't add any back-edges; no more work needs doing
159
- ( sccs, annotations)
160
- }
161
- }
162
54
}
163
55
164
56
impl < ' tcx > Index < OutlivesConstraintIndex > for OutlivesConstraintSet < ' tcx > {
0 commit comments