@@ -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 }
@@ -1208,53 +1211,32 @@ impl<'d,'t,'tcx,TYPER:mc::Typer<'tcx>> ExprUseVisitor<'d,'t,'tcx,TYPER> {
12081211 debug ! ( "walk_captures({})" , closure_expr. repr( self . tcx( ) ) ) ;
12091212
12101213 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+ }
12171235 }
12181236 }
12191237 } ) ;
12201238 }
12211239
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-
12581240 fn cat_captured_var ( & mut self ,
12591241 closure_id : ast:: NodeId ,
12601242 closure_span : Span ,
0 commit comments