@@ -5,8 +5,10 @@ use std::path::PathBuf;
5
5
use std:: rc:: Rc ;
6
6
use std:: str:: FromStr ;
7
7
8
- use polonius_engine:: { Algorithm , Output } ;
8
+ use polonius_engine:: { Algorithm , AllFacts , Output } ;
9
+ use rustc_data_structures:: frozen:: Frozen ;
9
10
use rustc_index:: IndexSlice ;
11
+ use rustc_infer:: infer:: outlives:: env:: RegionBoundPairs ;
10
12
use rustc_middle:: mir:: pretty:: { PrettyPrintMirOptions , dump_mir_with_options} ;
11
13
use rustc_middle:: mir:: { Body , PassWhere , Promoted , create_dump_file, dump_enabled, dump_mir} ;
12
14
use rustc_middle:: ty:: print:: with_no_trimmed_paths;
@@ -20,19 +22,20 @@ use rustc_span::sym;
20
22
use tracing:: { debug, instrument} ;
21
23
22
24
use crate :: borrow_set:: BorrowSet ;
23
- use crate :: consumers:: ConsumerOptions ;
25
+ use crate :: consumers:: { ConsumerOptions , RustcFacts } ;
24
26
use crate :: diagnostics:: RegionErrors ;
25
- use crate :: polonius:: PoloniusDiagnosticsContext ;
26
27
use crate :: polonius:: legacy:: {
27
28
PoloniusFacts , PoloniusFactsExt , PoloniusLocationTable , PoloniusOutput ,
28
29
} ;
30
+ use crate :: polonius:: { PoloniusContext , PoloniusDiagnosticsContext } ;
29
31
use crate :: region_infer:: RegionInferenceContext ;
30
- use crate :: region_infer:: opaque_types:: handle_opaque_type_uses;
31
- use crate :: type_check:: { self , MirTypeckResults } ;
32
+ use crate :: region_infer:: opaque_types:: DeferredOpaqueTypeError ;
33
+ use crate :: type_check:: free_region_relations:: UniversalRegionRelations ;
34
+ use crate :: type_check:: { self , MirTypeckRegionConstraints , MirTypeckResults } ;
32
35
use crate :: universal_regions:: UniversalRegions ;
33
36
use crate :: {
34
37
BorrowCheckRootCtxt , BorrowckInferCtxt , ClosureOutlivesSubject , ClosureRegionRequirements ,
35
- polonius, renumber,
38
+ DeferredClosureRequirements , YieldDoMirBorrowck , polonius, renumber,
36
39
} ;
37
40
38
41
/// The output of `nll::compute_regions`. This includes the computed `RegionInferenceContext`, any
@@ -73,6 +76,18 @@ pub(crate) fn replace_regions_in_mir<'tcx>(
73
76
universal_regions
74
77
}
75
78
79
+ pub ( crate ) struct YieldComputeRegions < ' tcx > {
80
+ pub ( crate ) constraints : MirTypeckRegionConstraints < ' tcx > ,
81
+ pub ( crate ) universal_region_relations : Frozen < UniversalRegionRelations < ' tcx > > ,
82
+ pub ( crate ) region_bound_pairs : Frozen < RegionBoundPairs < ' tcx > > ,
83
+ pub ( crate ) known_type_outlives_obligations : Frozen < Vec < ty:: PolyTypeOutlivesPredicate < ' tcx > > > ,
84
+ pub ( crate ) location_map : Rc < DenseLocationMap > ,
85
+ pub ( crate ) deferred_closure_requirements : DeferredClosureRequirements < ' tcx > ,
86
+ pub ( crate ) deferred_opaque_type_errors : Vec < DeferredOpaqueTypeError < ' tcx > > ,
87
+ polonius_facts : Option < AllFacts < RustcFacts > > ,
88
+ polonius_context : Option < PoloniusContext > ,
89
+ }
90
+
76
91
/// Computes the (non-lexical) regions from the input MIR.
77
92
///
78
93
/// This may result in errors being reported.
@@ -87,41 +102,95 @@ pub(crate) fn compute_regions<'a, 'tcx>(
87
102
move_data : & MoveData < ' tcx > ,
88
103
borrow_set : & BorrowSet < ' tcx > ,
89
104
consumer_options : Option < ConsumerOptions > ,
90
- ) -> NllOutput < ' tcx > {
105
+ ) -> YieldComputeRegions < ' tcx > {
91
106
let is_polonius_legacy_enabled = infcx. tcx . sess . opts . unstable_opts . polonius . is_legacy_enabled ( ) ;
92
107
let polonius_input = consumer_options. map ( |c| c. polonius_input ( ) ) . unwrap_or_default ( )
93
108
|| is_polonius_legacy_enabled;
94
- let polonius_output = consumer_options. map ( |c| c. polonius_output ( ) ) . unwrap_or_default ( )
95
- || is_polonius_legacy_enabled;
96
109
let mut polonius_facts =
97
110
( polonius_input || PoloniusFacts :: enabled ( infcx. tcx ) ) . then_some ( PoloniusFacts :: default ( ) ) ;
98
111
99
112
let location_map = Rc :: new ( DenseLocationMap :: new ( body) ) ;
100
113
101
114
// Run the MIR type-checker.
102
- let MirTypeckResults { constraints, universal_region_relations, polonius_context } =
103
- type_check:: type_check (
104
- root_cx,
105
- infcx,
106
- body,
107
- promoted,
108
- universal_regions,
109
- location_table,
110
- borrow_set,
111
- & mut polonius_facts,
112
- flow_inits,
113
- move_data,
114
- Rc :: clone ( & location_map) ,
115
- ) ;
116
-
117
- let ( constraints, deferred_opaque_type_errors) = handle_opaque_type_uses (
115
+ let MirTypeckResults {
116
+ constraints,
117
+ universal_region_relations,
118
+ region_bound_pairs,
119
+ known_type_outlives_obligations,
120
+ deferred_closure_requirements,
121
+ polonius_context,
122
+ } = type_check:: type_check (
118
123
root_cx,
119
124
infcx,
120
- constraints,
121
- & universal_region_relations,
125
+ body,
126
+ promoted,
127
+ universal_regions,
128
+ location_table,
129
+ borrow_set,
130
+ & mut polonius_facts,
131
+ flow_inits,
132
+ move_data,
122
133
Rc :: clone ( & location_map) ,
123
134
) ;
124
135
136
+ YieldComputeRegions {
137
+ constraints,
138
+ universal_region_relations,
139
+ region_bound_pairs,
140
+ known_type_outlives_obligations,
141
+ location_map,
142
+ deferred_closure_requirements,
143
+ deferred_opaque_type_errors : Default :: default ( ) ,
144
+ polonius_facts,
145
+ polonius_context,
146
+ }
147
+ }
148
+
149
+ pub ( crate ) fn compute_closure_requirements_modulo_opaques < ' tcx > (
150
+ partial_result : & YieldDoMirBorrowck < ' tcx > ,
151
+ ) -> Option < ClosureRegionRequirements < ' tcx > > {
152
+ let YieldDoMirBorrowck {
153
+ infcx,
154
+ body_owned,
155
+ yield_compute_regions :
156
+ YieldComputeRegions { constraints, universal_region_relations, location_map, .. } ,
157
+ ..
158
+ } = partial_result;
159
+
160
+ let mut regioncx = RegionInferenceContext :: new (
161
+ & infcx,
162
+ constraints. clone ( ) ,
163
+ universal_region_relations. clone ( ) ,
164
+ location_map. clone ( ) ,
165
+ ) ;
166
+ let ( closure_region_requirements, _nll_errors) = regioncx. solve ( infcx, & body_owned, None ) ;
167
+ closure_region_requirements
168
+ }
169
+
170
+ pub ( crate ) fn resume_compute_regions < ' tcx > (
171
+ root_cx : & mut BorrowCheckRootCtxt < ' tcx > ,
172
+ infcx : & BorrowckInferCtxt < ' tcx > ,
173
+ body : & Body < ' tcx > ,
174
+ location_table : & PoloniusLocationTable ,
175
+ move_data : & MoveData < ' tcx > ,
176
+ borrow_set : & BorrowSet < ' tcx > ,
177
+ consumer_options : Option < ConsumerOptions > ,
178
+ YieldComputeRegions {
179
+ constraints,
180
+ universal_region_relations,
181
+ region_bound_pairs : _,
182
+ known_type_outlives_obligations : _,
183
+ location_map,
184
+ deferred_closure_requirements,
185
+ deferred_opaque_type_errors,
186
+ mut polonius_facts,
187
+ polonius_context,
188
+ } : YieldComputeRegions < ' tcx > ,
189
+ ) -> NllOutput < ' tcx > {
190
+ assert ! ( deferred_closure_requirements. is_empty( ) ) ;
191
+ let is_polonius_legacy_enabled = infcx. tcx . sess . opts . unstable_opts . polonius . is_legacy_enabled ( ) ;
192
+ let polonius_output = consumer_options. map ( |c| c. polonius_output ( ) ) . unwrap_or_default ( )
193
+ || is_polonius_legacy_enabled;
125
194
// If requested, emit legacy polonius facts.
126
195
polonius:: legacy:: emit_facts (
127
196
& mut polonius_facts,
0 commit comments