diff options
| author | Esteban Küber <esteban@kuber.com.ar> | 2019-06-13 17:58:59 -0700 |
|---|---|---|
| committer | Esteban Küber <esteban@kuber.com.ar> | 2019-06-13 18:00:24 -0700 |
| commit | 8ce063a216768ed125eb4245a027fef431d7d78c (patch) | |
| tree | 27fc4fb94ad763b6a1628ed3458dff1c59c2a0bb | |
| parent | bdb05a84f3b9d0c7d39d2bbbe92d2695d33d79fc (diff) | |
Verify that the clone method call actually corresponds to std::clone::Clone::clone
| -rw-r--r-- | src/librustc_typeck/check/demand.rs | 20 |
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), ), }); } |
