@@ -880,130 +880,26 @@ fn convert_path_expr<'a, 'tcx>(
880
880
ExprKind :: Deref { arg : Expr { ty, temp_lifetime, span : expr. span , kind } . to_ref ( ) }
881
881
}
882
882
883
- Res :: Local ( var_hir_id) => convert_var ( cx, expr , var_hir_id) ,
883
+ Res :: Local ( var_hir_id) => convert_var ( cx, var_hir_id) ,
884
884
885
885
_ => span_bug ! ( expr. span, "res `{:?}` not yet implemented" , res) ,
886
886
}
887
887
}
888
888
889
- fn convert_var < ' tcx > (
890
- cx : & mut Cx < ' _ , ' tcx > ,
891
- expr : & ' tcx hir:: Expr < ' tcx > ,
892
- var_hir_id : hir:: HirId ,
893
- ) -> ExprKind < ' tcx > {
894
- let upvar_index = cx
895
- . typeck_results ( )
896
- . closure_captures
897
- . get ( & cx. body_owner )
898
- . and_then ( |upvars| upvars. get_full ( & var_hir_id) . map ( |( i, _, _) | i) ) ;
899
-
900
- debug ! (
901
- "convert_var({:?}): upvar_index={:?}, body_owner={:?}" ,
902
- var_hir_id, upvar_index, cx. body_owner
903
- ) ;
904
-
905
- let temp_lifetime = cx. region_scope_tree . temporary_scope ( expr. hir_id . local_id ) ;
906
-
907
- match upvar_index {
908
- None => ExprKind :: VarRef { id : var_hir_id } ,
889
+ fn convert_var < ' tcx > ( cx : & mut Cx < ' _ , ' tcx > , var_hir_id : hir:: HirId ) -> ExprKind < ' tcx > {
890
+ // We want upvars here not captures.
891
+ // Captures will be handled in MIR.
892
+ let is_upvar = cx
893
+ . tcx
894
+ . upvars_mentioned ( cx. body_owner )
895
+ . map_or ( false , |upvars| upvars. contains_key ( & var_hir_id) ) ;
909
896
910
- Some ( upvar_index) => {
911
- let closure_def_id = cx. body_owner ;
912
- let upvar_id = ty:: UpvarId {
913
- var_path : ty:: UpvarPath { hir_id : var_hir_id } ,
914
- closure_expr_id : closure_def_id. expect_local ( ) ,
915
- } ;
916
- let var_ty = cx. typeck_results ( ) . node_type ( var_hir_id) ;
897
+ debug ! ( "convert_var({:?}): is_upvar={}, body_owner={:?}" , var_hir_id, is_upvar, cx. body_owner) ;
917
898
918
- // FIXME free regions in closures are not right
919
- let closure_ty = cx
920
- . typeck_results ( )
921
- . node_type ( cx. tcx . hir ( ) . local_def_id_to_hir_id ( upvar_id. closure_expr_id ) ) ;
922
-
923
- // FIXME we're just hard-coding the idea that the
924
- // signature will be &self or &mut self and hence will
925
- // have a bound region with number 0
926
- let region = ty:: ReFree ( ty:: FreeRegion {
927
- scope : closure_def_id,
928
- bound_region : ty:: BoundRegion :: BrAnon ( 0 ) ,
929
- } ) ;
930
- let region = cx. tcx . mk_region ( region) ;
931
-
932
- let self_expr = if let ty:: Closure ( _, closure_substs) = closure_ty. kind ( ) {
933
- match cx. infcx . closure_kind ( closure_substs) . unwrap ( ) {
934
- ty:: ClosureKind :: Fn => {
935
- let ref_closure_ty = cx. tcx . mk_ref (
936
- region,
937
- ty:: TypeAndMut { ty : closure_ty, mutbl : hir:: Mutability :: Not } ,
938
- ) ;
939
- Expr {
940
- ty : closure_ty,
941
- temp_lifetime,
942
- span : expr. span ,
943
- kind : ExprKind :: Deref {
944
- arg : Expr {
945
- ty : ref_closure_ty,
946
- temp_lifetime,
947
- span : expr. span ,
948
- kind : ExprKind :: SelfRef ,
949
- }
950
- . to_ref ( ) ,
951
- } ,
952
- }
953
- }
954
- ty:: ClosureKind :: FnMut => {
955
- let ref_closure_ty = cx. tcx . mk_ref (
956
- region,
957
- ty:: TypeAndMut { ty : closure_ty, mutbl : hir:: Mutability :: Mut } ,
958
- ) ;
959
- Expr {
960
- ty : closure_ty,
961
- temp_lifetime,
962
- span : expr. span ,
963
- kind : ExprKind :: Deref {
964
- arg : Expr {
965
- ty : ref_closure_ty,
966
- temp_lifetime,
967
- span : expr. span ,
968
- kind : ExprKind :: SelfRef ,
969
- }
970
- . to_ref ( ) ,
971
- } ,
972
- }
973
- }
974
- ty:: ClosureKind :: FnOnce => Expr {
975
- ty : closure_ty,
976
- temp_lifetime,
977
- span : expr. span ,
978
- kind : ExprKind :: SelfRef ,
979
- } ,
980
- }
981
- } else {
982
- Expr { ty : closure_ty, temp_lifetime, span : expr. span , kind : ExprKind :: SelfRef }
983
- } ;
984
-
985
- // at this point we have `self.n`, which loads up the upvar
986
- let field_kind =
987
- ExprKind :: Field { lhs : self_expr. to_ref ( ) , name : Field :: new ( upvar_index) } ;
988
-
989
- // ...but the upvar might be an `&T` or `&mut T` capture, at which
990
- // point we need an implicit deref
991
- match cx. typeck_results ( ) . upvar_capture ( upvar_id) {
992
- ty:: UpvarCapture :: ByValue ( _) => field_kind,
993
- ty:: UpvarCapture :: ByRef ( borrow) => ExprKind :: Deref {
994
- arg : Expr {
995
- temp_lifetime,
996
- ty : cx. tcx . mk_ref (
997
- borrow. region ,
998
- ty:: TypeAndMut { ty : var_ty, mutbl : borrow. kind . to_mutbl_lossy ( ) } ,
999
- ) ,
1000
- span : expr. span ,
1001
- kind : field_kind,
1002
- }
1003
- . to_ref ( ) ,
1004
- } ,
1005
- }
1006
- }
899
+ if is_upvar {
900
+ ExprKind :: UpvarRef { closure_def_id : cx. body_owner , var_hir_id }
901
+ } else {
902
+ ExprKind :: VarRef { id : var_hir_id }
1007
903
}
1008
904
}
1009
905
@@ -1102,7 +998,7 @@ fn capture_upvar<'tcx>(
1102
998
temp_lifetime,
1103
999
ty : var_ty,
1104
1000
span : closure_expr. span ,
1105
- kind : convert_var ( cx, closure_expr , var_hir_id) ,
1001
+ kind : convert_var ( cx, var_hir_id) ,
1106
1002
} ;
1107
1003
match upvar_capture {
1108
1004
ty:: UpvarCapture :: ByValue ( _) => captured_var. to_ref ( ) ,
0 commit comments