@@ -512,10 +512,10 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
512
512
span_bug ! ( expr. span, "closure expr w/o closure type: {:?}" , closure_ty) ;
513
513
}
514
514
} ;
515
- let upvars = cx. tcx . upvars ( def_id) . iter ( )
516
- . flat_map ( |upvars| upvars. iter ( ) )
515
+ let upvars = cx. tables ( ) . upvar_list [ & def_id] . iter ( )
517
516
. zip ( substs. upvar_tys ( def_id, cx. tcx ) )
518
- . map ( |( upvar, ty) | capture_upvar ( cx, expr, upvar, ty) )
517
+ . enumerate ( )
518
+ . map ( |( index, ( & upvar_id, ty) ) | capture_upvar ( cx, expr, index, upvar_id, def_id, ty) )
519
519
. collect ( ) ;
520
520
ExprKind :: Closure {
521
521
closure_id : def_id,
@@ -1178,22 +1178,26 @@ fn overloaded_place<'a, 'gcx, 'tcx>(
1178
1178
1179
1179
fn capture_upvar < ' a , ' gcx , ' tcx > ( cx : & mut Cx < ' a , ' gcx , ' tcx > ,
1180
1180
closure_expr : & ' tcx hir:: Expr ,
1181
- upvar : & hir:: Upvar ,
1181
+ index : usize ,
1182
+ upvar_id : ty:: UpvarId ,
1183
+ def_id : DefId ,
1182
1184
upvar_ty : Ty < ' tcx > )
1183
1185
-> ExprRef < ' tcx > {
1184
- let var_hir_id = upvar. var_id ( ) ;
1185
- let upvar_id = ty:: UpvarId {
1186
- var_path : ty:: UpvarPath { hir_id : var_hir_id } ,
1187
- closure_expr_id : cx. tcx . hir ( ) . local_def_id_from_hir_id ( closure_expr. hir_id ) . to_local ( ) ,
1188
- } ;
1189
1186
let upvar_capture = cx. tables ( ) . upvar_capture ( upvar_id) ;
1190
1187
let temp_lifetime = cx. region_scope_tree . temporary_scope ( closure_expr. hir_id . local_id ) ;
1191
- let var_ty = cx. tables ( ) . node_type ( var_hir_id) ;
1188
+ let var_ty = cx. tables ( ) . node_type ( upvar_id. var_path . hir_id ) ;
1189
+
1190
+ // let var_node_id = cx.tcx.hir().hir_to_node_id(upvar_id.var_path.hir_id);
1191
+ let closure_expr_id = match cx. tcx . hir ( ) . as_local_node_id ( def_id) {
1192
+ Some ( node_id) => node_id,
1193
+ None => bug ! ( "cannot retrieve closure_expr_id from fake def id" ) ,
1194
+ } ;
1195
+ let upvar = Res :: Upvar ( upvar_id. var_path . hir_id , index, closure_expr_id) ;
1192
1196
let captured_var = Expr {
1193
1197
temp_lifetime,
1194
1198
ty : var_ty,
1195
1199
span : closure_expr. span ,
1196
- kind : convert_var ( cx, closure_expr, upvar. res ) ,
1200
+ kind : convert_var ( cx, closure_expr, upvar) ,
1197
1201
} ;
1198
1202
match upvar_capture {
1199
1203
ty:: UpvarCapture :: ByValue => captured_var. to_ref ( ) ,
0 commit comments