9
9
// except according to those terms.
10
10
11
11
use rustc:: mir:: { self , Mir , Location , Place } ;
12
- use rustc:: ty:: { self , TyCtxt } ;
12
+ use rustc:: ty:: { self , TyCtxt , ParamEnv } ;
13
13
use util:: elaborate_drops:: DropFlagState ;
14
14
15
15
use super :: indexes:: MovePathIndex ;
16
16
use super :: move_paths:: { MoveData , LookupResult , InitKind } ;
17
17
18
+ pub ( crate ) trait PlaceOneDropFlag < ' tcx > {
19
+ fn place_contents_drop_state_cannot_differ ( & self , & Place < ' tcx > ) -> bool ;
20
+ }
21
+
22
+ pub ( crate ) trait PlaceNeedsDrop < ' tcx > {
23
+ fn needs_drop ( & self , & Place < ' tcx > ) -> bool ;
24
+ }
25
+
26
+ impl < ' a , ' gcx , ' tcx > PlaceOneDropFlag < ' tcx > for ( TyCtxt < ' a , ' gcx , ' tcx > , & ' a Mir < ' tcx > ) {
27
+ fn place_contents_drop_state_cannot_differ ( & self , place : & Place < ' tcx > ) -> bool {
28
+ place_contents_drop_state_cannot_differ ( self . 0 , self . 1 , place)
29
+ }
30
+ }
31
+
32
+ impl < ' a , ' gcx , ' tcx > PlaceOneDropFlag < ' tcx > for ( TyCtxt < ' a , ' gcx , ' tcx > ,
33
+ & ' a Mir < ' tcx > ,
34
+ ParamEnv < ' gcx > )
35
+ {
36
+ fn place_contents_drop_state_cannot_differ ( & self , place : & Place < ' tcx > ) -> bool {
37
+ place_contents_drop_state_cannot_differ ( self . 0 , self . 1 , place)
38
+ }
39
+ }
40
+
41
+ impl < ' a , ' gcx , ' tcx > PlaceNeedsDrop < ' tcx > for ( TyCtxt < ' a , ' gcx , ' tcx > ,
42
+ & ' a Mir < ' tcx > ,
43
+ ParamEnv < ' gcx > )
44
+ {
45
+ fn needs_drop ( & self , place : & Place < ' tcx > ) -> bool {
46
+ place_needs_drop ( self . 0 , self . 1 , self . 2 , place)
47
+ }
48
+ }
49
+
18
50
pub fn move_path_children_matching < ' tcx , F > ( move_data : & MoveData < ' tcx > ,
19
51
path : MovePathIndex ,
20
52
mut cond : F )
@@ -55,7 +87,7 @@ pub fn move_path_children_matching<'tcx, F>(move_data: &MoveData<'tcx>,
55
87
/// is no need to maintain separate drop flags to track such state.
56
88
///
57
89
/// FIXME: we have to do something for moving slice patterns.
58
- pub ( crate ) fn place_contents_drop_state_cannot_differ < ' a , ' gcx , ' tcx > (
90
+ fn place_contents_drop_state_cannot_differ < ' a , ' gcx , ' tcx > (
59
91
tcx : TyCtxt < ' a , ' gcx , ' tcx > ,
60
92
mir : & Mir < ' tcx > ,
61
93
place : & Place < ' tcx > ) -> bool
@@ -83,119 +115,114 @@ pub(crate) fn place_contents_drop_state_cannot_differ<'a, 'gcx, 'tcx>(
83
115
}
84
116
}
85
117
86
- pub ( crate ) fn place_needs_drop < ' a , ' gcx , ' tcx > ( tcx : TyCtxt < ' a , ' gcx , ' tcx > ,
87
- mir : & Mir < ' tcx > ,
88
- param_env : ty:: ParamEnv < ' gcx > ,
89
- place : & Place < ' tcx > )
90
- -> bool
118
+ fn place_needs_drop < ' a , ' gcx , ' tcx > ( tcx : TyCtxt < ' a , ' gcx , ' tcx > ,
119
+ mir : & Mir < ' tcx > ,
120
+ param_env : ty:: ParamEnv < ' gcx > ,
121
+ place : & Place < ' tcx > )
122
+ -> bool
91
123
{
92
124
let ty = place. ty ( mir, tcx) . to_ty ( tcx) ;
93
- // debug!("on_all_drop_children_bits({:?}, {:?} : {:?})", path, place, ty);
94
-
95
125
let gcx = tcx. global_tcx ( ) ;
96
126
let erased_ty = gcx. lift ( & tcx. erase_regions ( & ty) ) . unwrap ( ) ;
97
127
erased_ty. needs_drop ( gcx, param_env)
98
128
}
99
129
100
- pub ( crate ) fn on_lookup_result_bits < ' tcx , F , U > ( move_data : & MoveData < ' tcx > ,
101
- lookup_result : LookupResult ,
102
- has_uniform_drop_state : U ,
103
- each_child : F )
104
- where F : FnMut ( MovePathIndex ) , U : Fn ( & Place < ' tcx > ) -> bool
130
+ pub ( crate ) fn on_lookup_result_bits < ' tcx , F , PO > ( tcx_mir : & PO ,
131
+ move_data : & MoveData < ' tcx > ,
132
+ lookup_result : LookupResult ,
133
+ each_child : F )
134
+ where F : FnMut ( MovePathIndex ) , PO : PlaceOneDropFlag < ' tcx > ,
105
135
{
106
136
match lookup_result {
107
137
LookupResult :: Parent ( ..) => {
108
138
// access to untracked value - do not touch children
109
139
}
110
140
LookupResult :: Exact ( e) => {
111
- on_all_children_bits ( move_data , e , has_uniform_drop_state , each_child)
141
+ on_all_children_bits ( tcx_mir , move_data , e , each_child)
112
142
}
113
143
}
114
144
}
115
145
116
- pub ( crate ) fn on_all_children_bits < ' tcx , F , U > ( move_data : & MoveData < ' tcx > ,
117
- move_path_index : MovePathIndex ,
118
- has_uniform_drop_state : U ,
119
- mut each_child : F )
120
- where F : FnMut ( MovePathIndex ) , U : Fn ( & Place < ' tcx > ) -> bool
146
+ pub ( crate ) fn on_all_children_bits < ' tcx , F , PO > ( tcx_mir : & PO ,
147
+ move_data : & MoveData < ' tcx > ,
148
+ move_path_index : MovePathIndex ,
149
+ mut each_child : F )
150
+ where F : FnMut ( MovePathIndex ) , PO : PlaceOneDropFlag < ' tcx >
121
151
{
122
- fn is_terminal_path < ' tcx , U > ( move_data : & MoveData < ' tcx > ,
123
- path : MovePathIndex ,
124
- has_uniform_drop_state : U ) -> bool
125
- where U : Fn ( & Place < ' tcx > ) -> bool
152
+ fn is_terminal_path < ' tcx , PO > ( tcx_mir : & PO ,
153
+ move_data : & MoveData < ' tcx > ,
154
+ path : MovePathIndex ) -> bool
155
+ where PO : PlaceOneDropFlag < ' tcx >
126
156
{
127
- // lvalue_contents_drop_state_cannot_differ
128
- has_uniform_drop_state ( & move_data . move_paths [ path ] . place )
157
+ let place = & move_data . move_paths [ path ] . place ;
158
+ tcx_mir . place_contents_drop_state_cannot_differ ( place)
129
159
}
130
160
131
- fn on_all_children_bits < ' tcx , F , U > ( move_data : & MoveData < ' tcx > ,
132
- move_path_index : MovePathIndex ,
133
- has_uniform_drop_state : & U ,
134
- each_child : & mut F )
135
- where F : FnMut ( MovePathIndex ) , U : Fn ( & Place < ' tcx > ) -> bool
161
+ fn on_all_children_bits < ' tcx , F , PO > ( tcx_mir : & PO ,
162
+ move_data : & MoveData < ' tcx > ,
163
+ move_path_index : MovePathIndex ,
164
+ each_child : & mut F )
165
+ where F : FnMut ( MovePathIndex ) , PO : PlaceOneDropFlag < ' tcx >
136
166
{
137
167
each_child ( move_path_index) ;
138
168
139
- if is_terminal_path ( move_data , move_path_index , has_uniform_drop_state ) {
169
+ if is_terminal_path ( tcx_mir , move_data , move_path_index ) {
140
170
return
141
171
}
142
172
143
173
let mut next_child_index = move_data. move_paths [ move_path_index] . first_child ;
144
174
while let Some ( child_index) = next_child_index {
145
- on_all_children_bits ( move_data , child_index , has_uniform_drop_state , each_child) ;
175
+ on_all_children_bits ( tcx_mir , move_data , child_index , each_child) ;
146
176
next_child_index = move_data. move_paths [ child_index] . next_sibling ;
147
177
}
148
178
}
149
- on_all_children_bits ( move_data , move_path_index , & has_uniform_drop_state , & mut each_child) ;
179
+ on_all_children_bits ( tcx_mir , move_data , move_path_index , & mut each_child) ;
150
180
}
151
181
152
- pub ( crate ) fn on_all_drop_children_bits < ' tcx , F , U , N > ( move_data : & MoveData < ' tcx > ,
153
- path : MovePathIndex ,
154
- has_uniform_drop_state : U ,
155
- needs_drop : N ,
156
- mut each_child : F )
157
- where F : FnMut ( MovePathIndex ) ,
158
- U : Fn ( & Place < ' tcx > ) -> bool ,
159
- N : Fn ( & Place < ' tcx > ) -> bool ,
182
+ pub ( crate ) fn on_all_drop_children_bits < ' tcx , F , PO > ( tcx_mir_param_env : & PO ,
183
+ move_data : & MoveData < ' tcx > ,
184
+ path : MovePathIndex ,
185
+ mut each_child : F )
186
+ where F : FnMut ( MovePathIndex ) , PO : PlaceOneDropFlag < ' tcx > + PlaceNeedsDrop < ' tcx >
160
187
{
161
- on_all_children_bits ( move_data , path , has_uniform_drop_state , |child| {
188
+ on_all_children_bits ( tcx_mir_param_env , move_data , path , |child| {
162
189
let place = & move_data. move_paths [ path] . place ;
163
190
// let ty = place.ty(mir, tcx).to_ty(tcx);
164
191
// debug!("on_all_drop_children_bits({:?}, {:?} : {:?})", path, place, ty);
165
192
166
193
// let gcx = tcx.global_tcx();
167
194
// let erased_ty = gcx.lift(&tcx.erase_regions(&ty)).unwrap();
168
195
// if erased_ty.needs_drop(gcx, ctxt.param_env) {
169
- if needs_drop ( place) {
196
+ if tcx_mir_param_env . needs_drop ( place) {
170
197
each_child ( child) ;
171
198
} else {
172
199
debug ! ( "on_all_drop_children_bits - skipping" )
173
200
}
174
201
} )
175
202
}
176
203
177
- pub ( crate ) fn drop_flag_effects_for_function_entry < ' tcx , F , U > (
204
+ pub ( crate ) fn drop_flag_effects_for_function_entry < ' tcx , F , PO > (
205
+ tcx_mir : & PO ,
178
206
mir : & Mir < ' tcx > ,
179
207
move_data : & MoveData < ' tcx > ,
180
- has_uniform_drop_state : U ,
181
208
mut callback : F )
182
- where F : FnMut ( MovePathIndex , DropFlagState ) , U : Fn ( & Place < ' tcx > ) -> bool
209
+ where F : FnMut ( MovePathIndex , DropFlagState ) , PO : PlaceOneDropFlag < ' tcx >
183
210
{
184
211
for arg in mir. args_iter ( ) {
185
212
let place = Place :: Local ( arg) ;
186
213
let lookup_result = move_data. rev_lookup . find ( & place) ;
187
- on_lookup_result_bits ( move_data,
214
+ on_lookup_result_bits ( tcx_mir,
215
+ move_data,
188
216
lookup_result,
189
- & has_uniform_drop_state,
190
217
|mpi| callback ( mpi, DropFlagState :: Present ) ) ;
191
218
}
192
219
}
193
220
194
- pub ( crate ) fn drop_flag_effects_for_location < ' tcx , F , U > ( move_data : & MoveData < ' tcx > ,
195
- loc : Location ,
196
- has_uniform_drop_state : U ,
197
- mut callback : F )
198
- where F : FnMut ( MovePathIndex , DropFlagState ) , U : Fn ( & Place < ' tcx > ) -> bool
221
+ pub ( crate ) fn drop_flag_effects_for_location < ' tcx , F , PO > ( tcx_mir : & PO ,
222
+ move_data : & MoveData < ' tcx > ,
223
+ loc : Location ,
224
+ mut callback : F )
225
+ where F : FnMut ( MovePathIndex , DropFlagState ) , PO : PlaceOneDropFlag < ' tcx >
199
226
{
200
227
debug ! ( "drop_flag_effects_for_location({:?})" , loc) ;
201
228
@@ -204,38 +231,38 @@ pub(crate) fn drop_flag_effects_for_location<'tcx, F, U>(move_data: &MoveData<'t
204
231
let path = mi. move_path_index ( move_data) ;
205
232
debug ! ( "moving out of path {:?}" , move_data. move_paths[ path] ) ;
206
233
207
- on_all_children_bits ( move_data,
234
+ on_all_children_bits ( tcx_mir,
235
+ move_data,
208
236
path,
209
- & has_uniform_drop_state,
210
237
|mpi| callback ( mpi, DropFlagState :: Absent ) )
211
238
}
212
239
213
240
debug ! ( "drop_flag_effects: assignment for location({:?})" , loc) ;
214
241
215
242
for_location_inits (
243
+ tcx_mir,
216
244
move_data,
217
245
loc,
218
- has_uniform_drop_state,
219
246
|mpi| callback ( mpi, DropFlagState :: Present )
220
247
) ;
221
248
}
222
249
223
- pub ( crate ) fn for_location_inits < ' tcx , F , U > (
250
+ pub ( crate ) fn for_location_inits < ' tcx , F , PO > (
251
+ tcx_mir : & PO ,
224
252
move_data : & MoveData < ' tcx > ,
225
253
loc : Location ,
226
- has_uniform_drop_state : U ,
227
254
mut callback : F )
228
- where F : FnMut ( MovePathIndex ) , U : Fn ( & Place < ' tcx > ) -> bool
255
+ where F : FnMut ( MovePathIndex ) , PO : PlaceOneDropFlag < ' tcx >
229
256
{
230
257
for ii in & move_data. init_loc_map [ loc] {
231
258
let init = move_data. inits [ * ii] ;
232
259
match init. kind {
233
260
InitKind :: Deep => {
234
261
let path = init. path ;
235
262
236
- on_all_children_bits ( move_data,
263
+ on_all_children_bits ( tcx_mir,
264
+ move_data,
237
265
path,
238
- & has_uniform_drop_state,
239
266
& mut callback)
240
267
} ,
241
268
InitKind :: Shallow => {
0 commit comments