@@ -5,6 +5,7 @@ use rustc_infer::infer::{
5
5
error_reporting:: nice_region_error:: NiceRegionError ,
6
6
error_reporting:: unexpected_hidden_region_diagnostic, NllRegionVariableOrigin ,
7
7
} ;
8
+ use rustc_middle:: hir:: place:: PlaceBase ;
8
9
use rustc_middle:: mir:: { ConstraintCategory , ReturnConstraint } ;
9
10
use rustc_middle:: ty:: subst:: { InternalSubsts , Subst } ;
10
11
use rustc_middle:: ty:: { self , RegionVid , Ty } ;
@@ -421,17 +422,26 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> {
421
422
422
423
diag. span_label ( * span, message) ;
423
424
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 {
426
426
let def_id = match self . regioncx . universal_regions ( ) . defining_ty {
427
427
DefiningTy :: Closure ( def_id, _) => def_id,
428
428
ty => bug ! ( "unexpected DefiningTy {:?}" , ty) ,
429
429
} ;
430
430
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
+ }
435
445
}
436
446
437
447
if let Some ( fr_span) = self . give_region_a_name ( * outlived_fr) . unwrap ( ) . span ( ) {
0 commit comments