@@ -18,7 +18,6 @@ use rustc::ty::maps::Providers;
18
18
use rustc:: mir:: { AssertMessage , BasicBlock , BorrowKind , Local , Location , Place } ;
19
19
use rustc:: mir:: { Mir , Mutability , Operand , Projection , ProjectionElem , Rvalue } ;
20
20
use rustc:: mir:: { Field , Statement , StatementKind , Terminator , TerminatorKind } ;
21
- use transform:: nll;
22
21
23
22
use rustc_data_structures:: fx:: FxHashSet ;
24
23
use rustc_data_structures:: indexed_set:: { self , IdxSetBuf } ;
@@ -39,6 +38,7 @@ use util::borrowck_errors::{BorrowckErrors, Origin};
39
38
40
39
use self :: MutateMode :: { JustWrite , WriteAndRead } ;
41
40
41
+ pub ( crate ) mod nll;
42
42
43
43
pub fn provide ( providers : & mut Providers ) {
44
44
* providers = Providers {
@@ -77,7 +77,21 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>(
77
77
. as_local_node_id ( def_id)
78
78
. expect ( "do_mir_borrowck: non-local DefId" ) ;
79
79
80
- let move_data: MoveData < ' tcx > = match MoveData :: gather_moves ( input_mir, tcx) {
80
+ // Make our own copy of the MIR. This copy will be modified (in place) to
81
+ // contain non-lexical lifetimes. It will have a lifetime tied
82
+ // to the inference context.
83
+ let mut mir: Mir < ' tcx > = input_mir. clone ( ) ;
84
+ let free_regions = if !tcx. sess . opts . debugging_opts . nll {
85
+ None
86
+ } else {
87
+ let mir = & mut mir;
88
+
89
+ // Replace all regions with fresh inference variables.
90
+ Some ( nll:: replace_regions_in_mir ( infcx, def_id, mir) )
91
+ } ;
92
+ let mir = & mir;
93
+
94
+ let move_data: MoveData < ' tcx > = match MoveData :: gather_moves ( mir, tcx) {
81
95
Ok ( move_data) => move_data,
82
96
Err ( ( move_data, move_errors) ) => {
83
97
for move_error in move_errors {
@@ -110,69 +124,64 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>(
110
124
}
111
125
} ;
112
126
113
- // Make our own copy of the MIR. This copy will be modified (in place) to
114
- // contain non-lexical lifetimes. It will have a lifetime tied
115
- // to the inference context.
116
- let mut mir: Mir < ' tcx > = input_mir. clone ( ) ;
117
- let mir = & mut mir;
118
-
119
- // If we are in non-lexical mode, compute the non-lexical lifetimes.
120
- let opt_regioncx = if !tcx. sess . opts . debugging_opts . nll {
121
- None
122
- } else {
123
- Some ( nll:: compute_regions ( infcx, def_id, param_env, mir) )
124
- } ;
125
-
126
127
let mdpe = MoveDataParamEnv {
127
128
move_data : move_data,
128
129
param_env : param_env,
129
130
} ;
130
131
let dead_unwinds = IdxSetBuf :: new_empty ( mir. basic_blocks ( ) . len ( ) ) ;
131
- let flow_borrows = do_dataflow (
132
- tcx,
133
- mir,
134
- id,
135
- & attributes,
136
- & dead_unwinds,
137
- Borrows :: new ( tcx, mir, opt_regioncx. as_ref ( ) ) ,
138
- |bd, i| bd. location ( i) ,
139
- ) ;
140
- let flow_inits = do_dataflow (
132
+ let mut flow_inits = FlowInProgress :: new ( do_dataflow (
141
133
tcx,
142
134
mir,
143
135
id,
144
136
& attributes,
145
137
& dead_unwinds,
146
138
MaybeInitializedLvals :: new ( tcx, mir, & mdpe) ,
147
139
|bd, i| & bd. move_data ( ) . move_paths [ i] ,
148
- ) ;
149
- let flow_uninits = do_dataflow (
140
+ ) ) ;
141
+ let flow_uninits = FlowInProgress :: new ( do_dataflow (
150
142
tcx,
151
143
mir,
152
144
id,
153
145
& attributes,
154
146
& dead_unwinds,
155
147
MaybeUninitializedLvals :: new ( tcx, mir, & mdpe) ,
156
148
|bd, i| & bd. move_data ( ) . move_paths [ i] ,
157
- ) ;
158
- let flow_move_outs = do_dataflow (
149
+ ) ) ;
150
+ let flow_move_outs = FlowInProgress :: new ( do_dataflow (
159
151
tcx,
160
152
mir,
161
153
id,
162
154
& attributes,
163
155
& dead_unwinds,
164
156
MovingOutStatements :: new ( tcx, mir, & mdpe) ,
165
157
|bd, i| & bd. move_data ( ) . moves [ i] ,
166
- ) ;
167
- let flow_ever_inits = do_dataflow (
158
+ ) ) ;
159
+ let flow_ever_inits = FlowInProgress :: new ( do_dataflow (
168
160
tcx,
169
161
mir,
170
162
id,
171
163
& attributes,
172
164
& dead_unwinds,
173
165
EverInitializedLvals :: new ( tcx, mir, & mdpe) ,
174
166
|bd, i| & bd. move_data ( ) . inits [ i] ,
175
- ) ;
167
+ ) ) ;
168
+
169
+ // If we are in non-lexical mode, compute the non-lexical lifetimes.
170
+ let opt_regioncx = if let Some ( free_regions) = free_regions {
171
+ Some ( nll:: compute_regions (
172
+ infcx,
173
+ def_id,
174
+ free_regions,
175
+ mir,
176
+ param_env,
177
+ & mut flow_inits,
178
+ & mdpe. move_data ,
179
+ ) )
180
+ } else {
181
+ assert ! ( !tcx. sess. opts. debugging_opts. nll) ;
182
+ None
183
+ } ;
184
+ let flow_inits = flow_inits; // remove mut
176
185
177
186
let mut mbcx = MirBorrowckCtxt {
178
187
tcx : tcx,
@@ -183,6 +192,16 @@ fn do_mir_borrowck<'a, 'gcx, 'tcx>(
183
192
storage_dead_or_drop_error_reported : FxHashSet ( ) ,
184
193
} ;
185
194
195
+ let flow_borrows = FlowInProgress :: new ( do_dataflow (
196
+ tcx,
197
+ mir,
198
+ id,
199
+ & attributes,
200
+ & dead_unwinds,
201
+ Borrows :: new ( tcx, mir, opt_regioncx) ,
202
+ |bd, i| bd. location ( i) ,
203
+ ) ) ;
204
+
186
205
let mut state = InProgress :: new (
187
206
flow_borrows,
188
207
flow_inits,
@@ -2318,19 +2337,19 @@ impl ContextKind {
2318
2337
}
2319
2338
2320
2339
impl < ' b , ' gcx , ' tcx > InProgress < ' b , ' gcx , ' tcx > {
2321
- pub ( super ) fn new (
2322
- borrows : DataflowResults < Borrows < ' b , ' gcx , ' tcx > > ,
2323
- inits : DataflowResults < MaybeInitializedLvals < ' b , ' gcx , ' tcx > > ,
2324
- uninits : DataflowResults < MaybeUninitializedLvals < ' b , ' gcx , ' tcx > > ,
2325
- move_out : DataflowResults < MovingOutStatements < ' b , ' gcx , ' tcx > > ,
2326
- ever_inits : DataflowResults < EverInitializedLvals < ' b , ' gcx , ' tcx > > ,
2340
+ fn new (
2341
+ borrows : FlowInProgress < Borrows < ' b , ' gcx , ' tcx > > ,
2342
+ inits : FlowInProgress < MaybeInitializedLvals < ' b , ' gcx , ' tcx > > ,
2343
+ uninits : FlowInProgress < MaybeUninitializedLvals < ' b , ' gcx , ' tcx > > ,
2344
+ move_outs : FlowInProgress < MovingOutStatements < ' b , ' gcx , ' tcx > > ,
2345
+ ever_inits : FlowInProgress < EverInitializedLvals < ' b , ' gcx , ' tcx > > ,
2327
2346
) -> Self {
2328
2347
InProgress {
2329
- borrows : FlowInProgress :: new ( borrows ) ,
2330
- inits : FlowInProgress :: new ( inits ) ,
2331
- uninits : FlowInProgress :: new ( uninits ) ,
2332
- move_outs : FlowInProgress :: new ( move_out ) ,
2333
- ever_inits : FlowInProgress :: new ( ever_inits ) ,
2348
+ borrows,
2349
+ inits,
2350
+ uninits,
2351
+ move_outs,
2352
+ ever_inits,
2334
2353
}
2335
2354
}
2336
2355
@@ -2436,8 +2455,11 @@ impl<'b, 'gcx, 'tcx> InProgress<'b, 'gcx, 'tcx> {
2436
2455
}
2437
2456
}
2438
2457
2439
- impl < ' b , ' gcx , ' tcx > FlowInProgress < MaybeUninitializedLvals < ' b , ' gcx , ' tcx > > {
2440
- fn has_any_child_of ( & self , mpi : MovePathIndex ) -> Option < MovePathIndex > {
2458
+ impl < ' tcx , T > FlowInProgress < T >
2459
+ where
2460
+ T : HasMoveData < ' tcx > + BitDenotation < Idx = MovePathIndex > ,
2461
+ {
2462
+ fn has_any_child_of ( & self , mpi : T :: Idx ) -> Option < T :: Idx > {
2441
2463
let move_data = self . base_results . operator ( ) . move_data ( ) ;
2442
2464
2443
2465
let mut todo = vec ! [ mpi] ;
0 commit comments