Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/infer/expr.rs')
-rw-r--r--crates/hir-ty/src/infer/expr.rs13
1 files changed, 12 insertions, 1 deletions
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs
index 3261c22313..b800c2e32a 100644
--- a/crates/hir-ty/src/infer/expr.rs
+++ b/crates/hir-ty/src/infer/expr.rs
@@ -934,7 +934,18 @@ impl<'a> InferenceContext<'a> {
match fn_x {
FnTrait::FnOnce => (),
FnTrait::FnMut => {
- if !matches!(derefed_callee.kind(Interner), TyKind::Ref(Mutability::Mut, _, _)) {
+ if let TyKind::Ref(Mutability::Mut, _, inner) = derefed_callee.kind(Interner) {
+ if adjustments
+ .last()
+ .map(|x| matches!(x.kind, Adjust::Borrow(_)))
+ .unwrap_or(true)
+ {
+ // prefer reborrow to move
+ adjustments
+ .push(Adjustment { kind: Adjust::Deref(None), target: inner.clone() });
+ adjustments.push(Adjustment::borrow(Mutability::Mut, inner.clone()))
+ }
+ } else {
adjustments.push(Adjustment::borrow(Mutability::Mut, derefed_callee.clone()));
}
}