@@ -92,7 +92,6 @@ use rustc_middle::mir::*;
9292use rustc_middle:: thir:: { ExprId , LintLevel } ;
9393use rustc_middle:: { bug, span_bug} ;
9494use rustc_session:: lint:: Level ;
95- use rustc_span:: source_map:: Spanned ;
9695use rustc_span:: { Span , DUMMY_SP } ;
9796use tracing:: { debug, instrument} ;
9897
@@ -128,8 +127,6 @@ struct Scope {
128127 /// end of the vector (top of the stack) first.
129128 drops : Vec < DropData > ,
130129
131- moved_locals : Vec < Local > ,
132-
133130 /// The drop index that will drop everything in and below this scope on an
134131 /// unwind path.
135132 cached_unwind_block : Option < DropIdx > ,
@@ -445,7 +442,6 @@ impl<'tcx> Scopes<'tcx> {
445442 source_scope : vis_scope,
446443 region_scope : region_scope. 0 ,
447444 drops : vec ! [ ] ,
448- moved_locals : vec ! [ ] ,
449445 cached_unwind_block : None ,
450446 cached_coroutine_drop_block : None ,
451447 } ) ;
@@ -1017,14 +1013,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
10171013 span_bug ! ( span, "region scope {:?} not in scope to drop {:?}" , region_scope, local) ;
10181014 }
10191015
1020- /// Indicates that the "local operand " stored in `local` is
1016+ /// Indicates that the "local operands " stored in `local` are
10211017 /// *moved* at some point during execution (see `local_scope` for
10221018 /// more information about what a "local operand" is -- in short,
10231019 /// it's an intermediate operand created as part of preparing some
10241020 /// MIR instruction). We use this information to suppress
1025- /// redundant drops on the non-unwind paths. This results in less
1026- /// MIR, but also avoids spurious borrow check errors
1027- /// (c.f. #64391).
1021+ /// redundant drops. This results in less MIR, but also avoids spurious
1022+ /// borrow check errors (c.f. #64391).
10281023 ///
10291024 /// Example: when compiling the call to `foo` here:
10301025 ///
@@ -1053,27 +1048,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
10531048 /// spurious borrow-check errors -- the problem, ironically, is
10541049 /// not the `DROP(_X)` itself, but the (spurious) unwind pathways
10551050 /// that it creates. See #64391 for an example.
1056- pub ( crate ) fn record_operands_moved ( & mut self , operands : & [ Spanned < Operand < ' tcx > > ] ) {
1051+ pub ( crate ) fn record_operands_moved ( & mut self , operands : & [ Operand < ' tcx > ] ) {
10571052 let local_scope = self . local_scope ( ) ;
10581053 let scope = self . scopes . scopes . last_mut ( ) . unwrap ( ) ;
10591054
10601055 assert_eq ! ( scope. region_scope, local_scope, "local scope is not the topmost scope!" , ) ;
10611056
10621057 // look for moves of a local variable, like `MOVE(_X)`
1063- let locals_moved = operands. iter ( ) . flat_map ( |operand| match operand. node {
1058+ let locals_moved = operands. iter ( ) . flat_map ( |operand| match operand {
10641059 Operand :: Copy ( _) | Operand :: Constant ( _) => None ,
10651060 Operand :: Move ( place) => place. as_local ( ) ,
10661061 } ) ;
10671062
10681063 for local in locals_moved {
1069- // check if we have a Drop for this operand and -- if so
1070- // -- add it to the list of moved operands. Note that this
1071- // local might not have been an operand created for this
1072- // call, it could come from other places too.
1073- if scope. drops . iter ( ) . any ( |drop| drop. local == local && drop. kind == DropKind :: Value ) {
1074- scope. moved_locals . push ( local) ;
1075- }
1064+ // Unschedule drops from the scope.
1065+ scope. drops . retain ( |drop| drop. local != local || drop. kind != DropKind :: Value ) ;
10761066 }
1067+ scope. invalidate_cache ( ) ;
10771068 }
10781069
10791070 // Other
@@ -1297,14 +1288,6 @@ fn build_scope_drops<'tcx>(
12971288 debug_assert_eq ! ( unwind_drops. drops[ unwind_to] . data. kind, drop_data. kind) ;
12981289 unwind_to = unwind_drops. drops [ unwind_to] . next ;
12991290
1300- // If the operand has been moved, and we are not on an unwind
1301- // path, then don't generate the drop. (We only take this into
1302- // account for non-unwind paths so as not to disturb the
1303- // caching mechanism.)
1304- if scope. moved_locals . iter ( ) . any ( |& o| o == local) {
1305- continue ;
1306- }
1307-
13081291 unwind_drops. add_entry_point ( block, unwind_to) ;
13091292
13101293 let next = cfg. start_new_block ( ) ;
0 commit comments