@@ -92,7 +92,6 @@ use rustc_middle::mir::*;
92
92
use rustc_middle:: thir:: { ExprId , LintLevel } ;
93
93
use rustc_middle:: { bug, span_bug} ;
94
94
use rustc_session:: lint:: Level ;
95
- use rustc_span:: source_map:: Spanned ;
96
95
use rustc_span:: { Span , DUMMY_SP } ;
97
96
use tracing:: { debug, instrument} ;
98
97
@@ -128,8 +127,6 @@ struct Scope {
128
127
/// end of the vector (top of the stack) first.
129
128
drops : Vec < DropData > ,
130
129
131
- moved_locals : Vec < Local > ,
132
-
133
130
/// The drop index that will drop everything in and below this scope on an
134
131
/// unwind path.
135
132
cached_unwind_block : Option < DropIdx > ,
@@ -445,7 +442,6 @@ impl<'tcx> Scopes<'tcx> {
445
442
source_scope : vis_scope,
446
443
region_scope : region_scope. 0 ,
447
444
drops : vec ! [ ] ,
448
- moved_locals : vec ! [ ] ,
449
445
cached_unwind_block : None ,
450
446
cached_coroutine_drop_block : None ,
451
447
} ) ;
@@ -1017,14 +1013,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1017
1013
span_bug ! ( span, "region scope {:?} not in scope to drop {:?}" , region_scope, local) ;
1018
1014
}
1019
1015
1020
- /// Indicates that the "local operand " stored in `local` is
1016
+ /// Indicates that the "local operands " stored in `local` are
1021
1017
/// *moved* at some point during execution (see `local_scope` for
1022
1018
/// more information about what a "local operand" is -- in short,
1023
1019
/// it's an intermediate operand created as part of preparing some
1024
1020
/// 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).
1028
1023
///
1029
1024
/// Example: when compiling the call to `foo` here:
1030
1025
///
@@ -1053,27 +1048,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
1053
1048
/// spurious borrow-check errors -- the problem, ironically, is
1054
1049
/// not the `DROP(_X)` itself, but the (spurious) unwind pathways
1055
1050
/// 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 > ] ) {
1057
1052
let local_scope = self . local_scope ( ) ;
1058
1053
let scope = self . scopes . scopes . last_mut ( ) . unwrap ( ) ;
1059
1054
1060
1055
assert_eq ! ( scope. region_scope, local_scope, "local scope is not the topmost scope!" , ) ;
1061
1056
1062
1057
// 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 {
1064
1059
Operand :: Copy ( _) | Operand :: Constant ( _) => None ,
1065
1060
Operand :: Move ( place) => place. as_local ( ) ,
1066
1061
} ) ;
1067
1062
1068
1063
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 ) ;
1076
1066
}
1067
+ scope. invalidate_cache ( ) ;
1077
1068
}
1078
1069
1079
1070
// Other
@@ -1297,14 +1288,6 @@ fn build_scope_drops<'tcx>(
1297
1288
debug_assert_eq ! ( unwind_drops. drops[ unwind_to] . data. kind, drop_data. kind) ;
1298
1289
unwind_to = unwind_drops. drops [ unwind_to] . next ;
1299
1290
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
-
1308
1291
unwind_drops. add_entry_point ( block, unwind_to) ;
1309
1292
1310
1293
let next = cfg. start_new_block ( ) ;
0 commit comments