@@ -791,53 +791,46 @@ impl<'d,'t,TYPER:mc::Typer> ExprUseVisitor<'d,'t,TYPER> {
791
791
792
792
let tcx = self . typer . tcx ( ) ;
793
793
freevars:: with_freevars ( tcx, closure_expr. id , |freevars| {
794
- match freevars:: get_capture_mode ( self . tcx ( ) , closure_expr. id ) {
795
- freevars:: CaptureByRef => {
796
- self . walk_by_ref_captures ( closure_expr, freevars) ;
797
- }
798
- freevars:: CaptureByValue => {
799
- self . walk_by_value_captures ( closure_expr, freevars) ;
794
+ for freevar in freevars. iter ( ) {
795
+ let cmt_var = return_if_err ! ( self . cat_captured_var(
796
+ closure_expr. id,
797
+ closure_expr. span,
798
+ freevar. def) ) ;
799
+ let upvar_id = ty:: UpvarId {
800
+ var_id : ast_util:: def_id_of_def ( freevar. def ) . node ,
801
+ closure_expr_id : closure_expr. id ,
802
+ } ;
803
+ match self . typer
804
+ . tcx ( )
805
+ . upvar_borrow_map
806
+ . borrow ( )
807
+ . find ( & upvar_id) {
808
+ None => {
809
+ self . delegate_consume ( closure_expr. id ,
810
+ freevar. span ,
811
+ cmt_var) ;
812
+ }
813
+ Some ( upvar_borrow) => {
814
+ let region =
815
+ ty:: ty_region ( tcx,
816
+ freevar. span ,
817
+ upvar_borrow. reborrowed_type ) ;
818
+ // Borrow `*x`, not `x`.
819
+ let upvar_cmt = self . mc . cat_deref ( closure_expr,
820
+ cmt_var,
821
+ 0 ) ;
822
+ self . delegate . borrow ( closure_expr. id ,
823
+ closure_expr. span ,
824
+ upvar_cmt,
825
+ region,
826
+ ty:: UniqueImmBorrow ,
827
+ ClosureCapture ( freevar. span ) ) ;
828
+ }
800
829
}
801
830
}
802
831
} ) ;
803
832
}
804
833
805
- fn walk_by_ref_captures ( & mut self ,
806
- closure_expr : & ast:: Expr ,
807
- freevars : & [ freevars:: freevar_entry ] ) {
808
- for freevar in freevars. iter ( ) {
809
- let id_var = ast_util:: def_id_of_def ( freevar. def ) . node ;
810
- let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
811
- closure_expr. span,
812
- freevar. def) ) ;
813
-
814
- // Lookup the kind of borrow the callee requires, as
815
- // inferred by regionbk
816
- let upvar_id = ty:: UpvarId { var_id : id_var,
817
- closure_expr_id : closure_expr. id } ;
818
- let upvar_borrow = self . tcx ( ) . upvar_borrow_map . borrow ( )
819
- . get_copy ( & upvar_id) ;
820
-
821
- self . delegate . borrow ( closure_expr. id ,
822
- closure_expr. span ,
823
- cmt_var,
824
- upvar_borrow. region ,
825
- upvar_borrow. kind ,
826
- ClosureCapture ( freevar. span ) ) ;
827
- }
828
- }
829
-
830
- fn walk_by_value_captures ( & mut self ,
831
- closure_expr : & ast:: Expr ,
832
- freevars : & [ freevars:: freevar_entry ] ) {
833
- for freevar in freevars. iter ( ) {
834
- let cmt_var = return_if_err ! ( self . cat_captured_var( closure_expr. id,
835
- closure_expr. span,
836
- freevar. def) ) ;
837
- self . delegate_consume ( closure_expr. id , freevar. span , cmt_var) ;
838
- }
839
- }
840
-
841
834
fn cat_captured_var ( & mut self ,
842
835
closure_id : ast:: NodeId ,
843
836
closure_span : Span ,
0 commit comments