summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_mir_transform/src/deduce_param_attrs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_mir_transform/src/deduce_param_attrs.rs')
-rw-r--r--compiler/rustc_mir_transform/src/deduce_param_attrs.rs48
1 files changed, 10 insertions, 38 deletions
diff --git a/compiler/rustc_mir_transform/src/deduce_param_attrs.rs b/compiler/rustc_mir_transform/src/deduce_param_attrs.rs
index 28b1c5a48..92f1fff6b 100644
--- a/compiler/rustc_mir_transform/src/deduce_param_attrs.rs
+++ b/compiler/rustc_mir_transform/src/deduce_param_attrs.rs
@@ -110,15 +110,16 @@ impl<'tcx> Visitor<'tcx> for DeduceReadOnly {
if let TerminatorKind::Call { ref args, .. } = terminator.kind {
for arg in args {
- if let Operand::Move(_) = *arg {
- // ArgumentChecker panics if a direct move of an argument from a caller to a
- // callee was detected.
- //
- // If, in the future, MIR optimizations cause arguments to be moved directly
- // from callers to callees, change the panic to instead add the argument in
- // question to `mutating_uses`.
- ArgumentChecker::new(self.mutable_args.domain_size())
- .visit_operand(arg, location)
+ if let Operand::Move(place) = *arg {
+ let local = place.local;
+ if place.is_indirect()
+ || local == RETURN_PLACE
+ || local.index() > self.mutable_args.domain_size()
+ {
+ continue;
+ }
+
+ self.mutable_args.insert(local.index() - 1);
}
}
};
@@ -127,35 +128,6 @@ impl<'tcx> Visitor<'tcx> for DeduceReadOnly {
}
}
-/// A visitor that simply panics if a direct move of an argument from a caller to a callee was
-/// detected.
-struct ArgumentChecker {
- /// The number of arguments to the calling function.
- arg_count: usize,
-}
-
-impl ArgumentChecker {
- /// Creates a new ArgumentChecker.
- fn new(arg_count: usize) -> Self {
- Self { arg_count }
- }
-}
-
-impl<'tcx> Visitor<'tcx> for ArgumentChecker {
- fn visit_local(&mut self, local: Local, context: PlaceContext, _: Location) {
- // Check to make sure that, if this local is an argument, we didn't move directly from it.
- if matches!(context, PlaceContext::NonMutatingUse(NonMutatingUseContext::Move))
- && local != RETURN_PLACE
- && local.index() <= self.arg_count
- {
- // If, in the future, MIR optimizations cause arguments to be moved directly from
- // callers to callees, change this panic to instead add the argument in question to
- // `mutating_uses`.
- panic!("Detected a direct move from a caller's argument to a callee's argument!")
- }
- }
-}
-
/// Returns true if values of a given type will never be passed indirectly, regardless of ABI.
fn type_will_always_be_passed_directly<'tcx>(ty: Ty<'tcx>) -> bool {
matches!(