@@ -366,6 +366,9 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
366366 consume_id : ast:: NodeId ,
367367 consume_span : Span ,
368368 cmt : mc:: cmt < ' tcx > ) {
369+ debug ! ( "delegate_consume(consume_id={}, cmt={})" ,
370+ consume_id, cmt. repr( self . tcx( ) ) ) ;
371+
369372 let mode = copy_or_move ( self . typer , & cmt, DirectRefMove ) ;
370373 self . delegate . consume ( consume_id, consume_span, cmt, mode) ;
371374 }
@@ -1194,53 +1197,32 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
11941197 debug ! ( "walk_captures({})" , closure_expr. repr( self . tcx( ) ) ) ;
11951198
11961199 ty:: with_freevars ( self . tcx ( ) , closure_expr. id , |freevars| {
1197- match self . tcx ( ) . capture_mode ( closure_expr. id ) {
1198- ast:: CaptureByRef => {
1199- self . walk_by_ref_captures ( closure_expr, freevars) ;
1200- }
1201- ast:: CaptureByValue => {
1202- self . walk_by_value_captures ( closure_expr, freevars) ;
1200+ for freevar in freevars. iter ( ) {
1201+ let id_var = freevar. def . def_id ( ) . node ;
1202+ let upvar_id = ty:: UpvarId { var_id : id_var,
1203+ closure_expr_id : closure_expr. id } ;
1204+ let upvar_capture = self . typer . upvar_capture ( upvar_id) . unwrap ( ) ;
1205+ let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1206+ closure_expr. span,
1207+ freevar. def) ) ;
1208+ match upvar_capture {
1209+ ty:: UpvarCapture :: ByValue => {
1210+ let mode = copy_or_move ( self . typer , & cmt_var, CaptureMove ) ;
1211+ self . delegate . consume ( closure_expr. id , freevar. span , cmt_var, mode) ;
1212+ }
1213+ ty:: UpvarCapture :: ByRef ( upvar_borrow) => {
1214+ self . delegate . borrow ( closure_expr. id ,
1215+ closure_expr. span ,
1216+ cmt_var,
1217+ upvar_borrow. region ,
1218+ upvar_borrow. kind ,
1219+ ClosureCapture ( freevar. span ) ) ;
1220+ }
12031221 }
12041222 }
12051223 } ) ;
12061224 }
12071225
1208- fn walk_by_ref_captures ( & mut self ,
1209- closure_expr : & ast:: Expr ,
1210- freevars : & [ ty:: Freevar ] ) {
1211- for freevar in freevars. iter ( ) {
1212- let id_var = freevar. def . def_id ( ) . node ;
1213- let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1214- closure_expr. span,
1215- freevar. def) ) ;
1216-
1217- // Lookup the kind of borrow the callee requires, as
1218- // inferred by regionbk
1219- let upvar_id = ty:: UpvarId { var_id : id_var,
1220- closure_expr_id : closure_expr. id } ;
1221- let upvar_borrow = self . typer . upvar_borrow ( upvar_id) . unwrap ( ) ;
1222-
1223- self . delegate . borrow ( closure_expr. id ,
1224- closure_expr. span ,
1225- cmt_var,
1226- upvar_borrow. region ,
1227- upvar_borrow. kind ,
1228- ClosureCapture ( freevar. span ) ) ;
1229- }
1230- }
1231-
1232- fn walk_by_value_captures ( & mut self ,
1233- closure_expr : & ast:: Expr ,
1234- freevars : & [ ty:: Freevar ] ) {
1235- for freevar in freevars. iter ( ) {
1236- let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
1237- closure_expr. span,
1238- freevar. def) ) ;
1239- let mode = copy_or_move ( self . typer , & cmt_var, CaptureMove ) ;
1240- self . delegate . consume ( closure_expr. id , freevar. span , cmt_var, mode) ;
1241- }
1242- }
1243-
12441226 fn cat_captured_var ( & mut self ,
12451227 closure_id : ast:: NodeId ,
12461228 closure_span : Span ,
0 commit comments