@@ -512,10 +512,10 @@ fn make_mirror_unadjusted<'a, 'gcx, 'tcx>(cx: &mut Cx<'a, 'gcx, 'tcx>,
512512 span_bug ! ( expr. span, "closure expr w/o closure type: {:?}" , closure_ty) ;
513513 }
514514 } ;
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 ( )
517516 . 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) )
519519 . collect ( ) ;
520520 ExprKind :: Closure {
521521 closure_id : def_id,
@@ -1178,22 +1178,26 @@ fn overloaded_place<'a, 'gcx, 'tcx>(
11781178
11791179fn capture_upvar < ' a , ' gcx , ' tcx > ( cx : & mut Cx < ' a , ' gcx , ' tcx > ,
11801180 closure_expr : & ' tcx hir:: Expr ,
1181- upvar : & hir:: Upvar ,
1181+ index : usize ,
1182+ upvar_id : ty:: UpvarId ,
1183+ def_id : DefId ,
11821184 upvar_ty : Ty < ' tcx > )
11831185 -> 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- } ;
11891186 let upvar_capture = cx. tables ( ) . upvar_capture ( upvar_id) ;
11901187 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) ;
11921196 let captured_var = Expr {
11931197 temp_lifetime,
11941198 ty : var_ty,
11951199 span : closure_expr. span ,
1196- kind : convert_var ( cx, closure_expr, upvar. res ) ,
1200+ kind : convert_var ( cx, closure_expr, upvar) ,
11971201 } ;
11981202 match upvar_capture {
11991203 ty:: UpvarCapture :: ByValue => captured_var. to_ref ( ) ,
0 commit comments