@@ -84,7 +84,7 @@ that contains only loops and breakable blocks. It tracks where a `break`,
84
84
use std:: mem;
85
85
86
86
use crate :: build:: { BlockAnd , BlockAndExtension , BlockFrame , Builder , CFG } ;
87
- use rustc_data_structures:: fx:: FxHashMap ;
87
+ use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
88
88
use rustc_hir:: HirId ;
89
89
use rustc_index:: { IndexSlice , IndexVec } ;
90
90
use rustc_middle:: middle:: region;
@@ -1195,15 +1195,18 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1195
1195
assert_eq ! ( scope. region_scope, local_scope, "local scope is not the topmost scope!" , ) ;
1196
1196
1197
1197
// look for moves of a local variable, like `MOVE(_X)`
1198
- let locals_moved = operands. iter ( ) . flat_map ( |operand| match operand {
1199
- Operand :: Copy ( _) | Operand :: Constant ( _) => None ,
1200
- Operand :: Move ( place) => place. as_local ( ) ,
1201
- } ) ;
1198
+ let locals_moved: FxHashSet < Local > = operands
1199
+ . iter ( )
1200
+ . flat_map ( |operand| match operand {
1201
+ Operand :: Copy ( _) | Operand :: Constant ( _) => None ,
1202
+ Operand :: Move ( place) => place. as_local ( ) ,
1203
+ } )
1204
+ . collect ( ) ;
1202
1205
1203
- for local in locals_moved {
1204
- // Unschedule drops from the scope.
1205
- scope . drops . retain ( |drop| drop . local != local || drop . kind != DropKind :: Value ) ;
1206
- }
1206
+ // Unschedule drops from the scope.
1207
+ scope
1208
+ . drops
1209
+ . retain ( |drop| drop . kind != DropKind :: Value || !locals_moved . contains ( & drop . local ) ) ;
1207
1210
scope. invalidate_cache ( ) ;
1208
1211
}
1209
1212
0 commit comments