From cb6beef46079183850d0a56895e630c6b5fb4ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Thu, 23 May 2019 04:39:49 +0200 Subject: [PATCH] Make MIR drop terminators borrow the dropped location --- src/librustc_mir/dataflow/impls/borrowed_locals.rs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/librustc_mir/dataflow/impls/borrowed_locals.rs b/src/librustc_mir/dataflow/impls/borrowed_locals.rs index 42c2387b7052d..81e75d611326f 100644 --- a/src/librustc_mir/dataflow/impls/borrowed_locals.rs +++ b/src/librustc_mir/dataflow/impls/borrowed_locals.rs @@ -56,9 +56,20 @@ impl<'a, 'tcx> BitDenotation<'tcx> for HaveBeenBorrowedLocals<'a, 'tcx> { fn terminator_effect(&self, sets: &mut BlockSets<'_, Local>, loc: Location) { + let terminator = self.mir[loc.block].terminator(); BorrowedLocalsVisitor { sets, - }.visit_terminator(self.mir[loc.block].terminator(), loc); + }.visit_terminator(terminator, loc); + match &terminator.kind { + // Drop terminators borrows the location + TerminatorKind::Drop { location, .. } | + TerminatorKind::DropAndReplace { location, .. } => { + if let Some(local) = find_local(location) { + sets.gen(local); + } + } + _ => (), + } } fn propagate_call_return(