@@ -366,6 +366,9 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
366
366
consume_id : ast:: NodeId ,
367
367
consume_span : Span ,
368
368
cmt : mc:: cmt < ' tcx > ) {
369
+ debug ! ( "delegate_consume(consume_id={}, cmt={})" ,
370
+ consume_id, cmt. repr( self . tcx( ) ) ) ;
371
+
369
372
let mode = copy_or_move ( self . typer , & cmt, DirectRefMove ) ;
370
373
self . delegate . consume ( consume_id, consume_span, cmt, mode) ;
371
374
}
@@ -1208,53 +1211,32 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
1208
1211
debug ! ( "walk_captures({})" , closure_expr. repr( self . tcx( ) ) ) ;
1209
1212
1210
1213
ty:: with_freevars ( self . tcx ( ) , closure_expr. id , |freevars| {
1211
- match self . tcx ( ) . capture_mode ( closure_expr. id ) {
1212
- ast:: CaptureByRef => {
1213
- self . walk_by_ref_captures ( closure_expr, freevars) ;
1214
- }
1215
- ast:: CaptureByValue => {
1216
- self . walk_by_value_captures ( closure_expr, freevars) ;
1214
+ for freevar in freevars. iter ( ) {
1215
+ let id_var = freevar. def . def_id ( ) . node ;
1216
+ let upvar_id = ty:: UpvarId { var_id : id_var,
1217
+ closure_expr_id : closure_expr. id } ;
1218
+ let upvar_capture = self . typer . upvar_capture ( upvar_id) . unwrap ( ) ;
1219
+ let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1220
+ closure_expr. span,
1221
+ freevar. def) ) ;
1222
+ match upvar_capture {
1223
+ ty:: UpvarCapture :: ByValue => {
1224
+ let mode = copy_or_move ( self . typer , & cmt_var, CaptureMove ) ;
1225
+ self . delegate . consume ( closure_expr. id , freevar. span , cmt_var, mode) ;
1226
+ }
1227
+ ty:: UpvarCapture :: ByRef ( upvar_borrow) => {
1228
+ self . delegate . borrow ( closure_expr. id ,
1229
+ closure_expr. span ,
1230
+ cmt_var,
1231
+ upvar_borrow. region ,
1232
+ upvar_borrow. kind ,
1233
+ ClosureCapture ( freevar. span ) ) ;
1234
+ }
1217
1235
}
1218
1236
}
1219
1237
} ) ;
1220
1238
}
1221
1239
1222
- fn walk_by_ref_captures ( & mut self ,
1223
- closure_expr : & ast:: Expr ,
1224
- freevars : & [ ty:: Freevar ] ) {
1225
- for freevar in freevars. iter ( ) {
1226
- let id_var = freevar. def . def_id ( ) . node ;
1227
- let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1228
- closure_expr. span,
1229
- freevar. def) ) ;
1230
-
1231
- // Lookup the kind of borrow the callee requires, as
1232
- // inferred by regionbk
1233
- let upvar_id = ty:: UpvarId { var_id : id_var,
1234
- closure_expr_id : closure_expr. id } ;
1235
- let upvar_borrow = self . typer . upvar_borrow ( upvar_id) . unwrap ( ) ;
1236
-
1237
- self . delegate . borrow ( closure_expr. id ,
1238
- closure_expr. span ,
1239
- cmt_var,
1240
- upvar_borrow. region ,
1241
- upvar_borrow. kind ,
1242
- ClosureCapture ( freevar. span ) ) ;
1243
- }
1244
- }
1245
-
1246
- fn walk_by_value_captures ( & mut self ,
1247
- closure_expr : & ast:: Expr ,
1248
- freevars : & [ ty:: Freevar ] ) {
1249
- for freevar in freevars. iter ( ) {
1250
- let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1251
- closure_expr. span,
1252
- freevar. def) ) ;
1253
- let mode = copy_or_move ( self . typer , & cmt_var, CaptureMove ) ;
1254
- self . delegate . consume ( closure_expr. id , freevar. span , cmt_var, mode) ;
1255
- }
1256
- }
1257
-
1258
1240
fn cat_captured_var ( & mut self ,
1259
1241
closure_id : ast:: NodeId ,
1260
1242
closure_span : Span ,
0 commit comments