about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-06-13 17:58:59 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-06-13 18:00:24 -0700
commit8ce063a216768ed125eb4245a027fef431d7d78c (patch)
tree27fc4fb94ad763b6a1628ed3458dff1c59c2a0bb
parentbdb05a84f3b9d0c7d39d2bbbe92d2695d33d79fc (diff)
Verify that the clone method call actually corresponds to std::clone::Clone::clone
-rw-r--r--src/librustc_typeck/check/demand.rs20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/librustc_typeck/check/demand.rs b/src/librustc_typeck/check/demand.rs
index bc36162e02f..b26e6ccb559 100644
--- a/src/librustc_typeck/check/demand.rs
+++ b/src/librustc_typeck/check/demand.rs
@@ -425,19 +425,29 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
                                 }
                             }
                         }
-                        // If this expression had a clone call, when suggesting borrowing, we
-                        // want to suggest removing it
-                        let sugg_expr = sugg_expr.trim_end_matches(".clone()");
+
+                        let mut sugg = sugg_expr.as_str();
+                        if let hir::ExprKind::MethodCall(_segment, _sp, _args) = &expr.node {
+                            let clone_path = "std::clone::Clone::clone";
+                            if let Some(true) = self.tables.borrow()
+                                .type_dependent_def_id(expr.hir_id)
+                                .map(|did| self.tcx.def_path_str(did).as_str() == clone_path)
+                            {
+                                // If this expression had a clone call when suggesting borrowing
+                                // we want to suggest removing it because it'd now be unecessary.
+                                sugg = sugg_expr.trim_end_matches(".clone()");
+                            }
+                        }
                         return Some(match mutability {
                             hir::Mutability::MutMutable => (
                                 sp,
                                 "consider mutably borrowing here",
-                                format!("{}&mut {}", field_name, sugg_expr),
+                                format!("{}&mut {}", field_name, sugg),
                             ),
                             hir::Mutability::MutImmutable => (
                                 sp,
                                 "consider borrowing here",
-                                format!("{}&{}", field_name, sugg_expr),
+                                format!("{}&{}", field_name, sugg),
                             ),
                         });
                     }