about summary refs log tree commit diff
path: root/compiler/rustc_borrowck
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2022-11-03 13:51:44 -0700
committerEsteban Küber <esteban@kuber.com.ar>2022-11-23 12:17:47 -0800
commitd687d46f68295c5e8aa318492500d22450d89b20 (patch)
tree4f8f9285dd4a4659986724f258f50873cd95bf2f /compiler/rustc_borrowck
parentc0e481731ba72eb120a74da454bb806397ca165c (diff)
downloadrust-d687d46f68295c5e8aa318492500d22450d89b20.tar.gz
rust-d687d46f68295c5e8aa318492500d22450d89b20.zip
Tweak output in for loops
Do not suggest `.clone()` as we already suggest borrowing the iterated
value.
Diffstat (limited to 'compiler/rustc_borrowck')
-rw-r--r--compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs14
1 files changed, 11 insertions, 3 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
index 18d8bbf9047..e917d527eb3 100644
--- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
+++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
@@ -397,8 +397,7 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
                         && let Some(node) = hir.find(hir.local_def_id_to_hir_id(def_id))
                         && let Some(fn_sig) = node.fn_sig()
                         && let Some(ident) = node.ident()
-                        && let Some(pos) = args.iter()
-                            .position(|arg| arg.hir_id == expr.hir_id)
+                        && let Some(pos) = args.iter().position(|arg| arg.hir_id == expr.hir_id)
                         && let Some(arg) = fn_sig.decl.inputs.get(pos + offset)
                     {
                         let mut span: MultiSpan = arg.span.into();
@@ -425,7 +424,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> {
                     }
                     let place = &self.move_data.move_paths[mpi].place;
                     let ty = place.ty(self.body, self.infcx.tcx).ty;
-                    self.suggest_cloning(err, ty, move_span);
+                    if let hir::Node::Expr(parent_expr) = parent
+                        && let hir::ExprKind::Call(call_expr, _) = parent_expr.kind
+                        && let hir::ExprKind::Path(
+                            hir::QPath::LangItem(LangItem::IntoIterIntoIter, _, _)
+                        ) = call_expr.kind
+                    {
+                        // Do not suggest `.clone()` in a `for` loop, we already suggest borrowing.
+                    } else {
+                        self.suggest_cloning(err, ty, move_span);
+                    }
                 }
             }
             if let Some(pat) = finder.pat && !seen_spans.contains(&pat.span) {