Skip to content

Commit 4919d55

Browse files
committed
fix location for nested bodies in promoteds
1 parent d1ed52b commit 4919d55

File tree

1 file changed

+13
-0
lines changed
  • compiler/rustc_borrowck/src/type_check

1 file changed

+13
-0
lines changed

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,13 +505,15 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
505505
let mut constraints = Default::default();
506506
let mut liveness_constraints =
507507
LivenessValues::without_specific_points(Rc::new(DenseLocationMap::new(promoted_body)));
508+
let mut deferred_closure_requirements = Default::default();
508509

509510
// Don't try to add borrow_region facts for the promoted MIR as they refer
510511
// to the wrong locations.
511512
let mut swap_constraints = |this: &mut Self| {
512513
mem::swap(this.polonius_facts, polonius_facts);
513514
mem::swap(&mut this.constraints.outlives_constraints, &mut constraints);
514515
mem::swap(&mut this.constraints.liveness_constraints, &mut liveness_constraints);
516+
mem::swap(this.deferred_closure_requirements, &mut deferred_closure_requirements);
515517
};
516518

517519
swap_constraints(self);
@@ -536,6 +538,17 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
536538
}
537539
self.constraints.outlives_constraints.push(constraint)
538540
}
541+
542+
// If there are nested bodies in promoteds, we also need to update their
543+
// location to something in the actually body, not the promoted.
544+
//
545+
// We don't update the constraint categories of the resulting constraints
546+
// as returns in nested bodies are a proper return, even if that nested body
547+
// is in a promoted.
548+
for (closure_def_id, args, _locations) in deferred_closure_requirements {
549+
self.deferred_closure_requirements.push((closure_def_id, args, locations));
550+
}
551+
539552
// If the region is live at least one location in the promoted MIR,
540553
// then add a liveness constraint to the main MIR for this region
541554
// at the location provided as an argument to this method

0 commit comments

Comments
 (0)