@@ -5,6 +5,7 @@ use rustc_infer::infer::{
55 error_reporting:: nice_region_error:: NiceRegionError ,
66 error_reporting:: unexpected_hidden_region_diagnostic, NllRegionVariableOrigin ,
77} ;
8+ use rustc_middle:: hir:: place:: PlaceBase ;
89use rustc_middle:: mir:: { ConstraintCategory , ReturnConstraint } ;
910use rustc_middle:: ty:: subst:: { InternalSubsts , Subst } ;
1011use rustc_middle:: ty:: { self , RegionVid , Ty } ;
@@ -421,17 +422,26 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
421422
422423 diag. span_label ( * span, message) ;
423424
424- // FIXME(project-rfc-2229#48): This should store a captured_place not a hir id
425- if let ReturnConstraint :: ClosureUpvar ( upvar) = kind {
425+ if let ReturnConstraint :: ClosureUpvar ( upvar_field) = kind {
426426 let def_id = match self . regioncx . universal_regions ( ) . defining_ty {
427427 DefiningTy :: Closure ( def_id, _) => def_id,
428428 ty => bug ! ( "unexpected DefiningTy {:?}" , ty) ,
429429 } ;
430430
431- let upvar_def_span = self . infcx . tcx . hir ( ) . span ( upvar) ;
432- let upvar_span = self . infcx . tcx . upvars_mentioned ( def_id) . unwrap ( ) [ & upvar] . span ;
433- diag. span_label ( upvar_def_span, "variable defined here" ) ;
434- diag. span_label ( upvar_span, "variable captured here" ) ;
431+ let captured_place = & self . upvars [ upvar_field. index ( ) ] . place ;
432+ let defined_hir = match captured_place. place . base {
433+ PlaceBase :: Local ( hirid) => Some ( hirid) ,
434+ PlaceBase :: Upvar ( upvar) => Some ( upvar. var_path . hir_id ) ,
435+ _ => None ,
436+ } ;
437+
438+ if defined_hir. is_some ( ) {
439+ let upvars_map = self . infcx . tcx . upvars_mentioned ( def_id) . unwrap ( ) ;
440+ let upvar_def_span = self . infcx . tcx . hir ( ) . span ( defined_hir. unwrap ( ) ) ;
441+ let upvar_span = upvars_map. get ( & defined_hir. unwrap ( ) ) . unwrap ( ) . span ;
442+ diag. span_label ( upvar_def_span, "variable defined here" ) ;
443+ diag. span_label ( upvar_span, "variable captured here" ) ;
444+ }
435445 }
436446
437447 if let Some ( fr_span) = self . give_region_a_name ( * outlived_fr) . unwrap ( ) . span ( ) {
0 commit comments