about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-05-24 18:24:20 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-06-13 16:46:07 -0700
commitbdb05a84f3b9d0c7d39d2bbbe92d2695d33d79fc (patch)
treee176a53eb20b178b7045b209a824c24bc909f789
parent0e4a56b4b04ea98bb16caada30cb2418dd06e250 (diff)
downloadrust-bdb05a84f3b9d0c7d39d2bbbe92d2695d33d79fc.tar.gz
rust-bdb05a84f3b9d0c7d39d2bbbe92d2695d33d79fc.zip
When suggesting to borrow, remove useless clones
-rw-r--r--src/librustc_typeck/check/demand.rs3
-rw-r--r--src/test/ui/issues/issue-61106.rs6
-rw-r--r--src/test/ui/issues/issue-61106.stderr15
3 files changed, 24 insertions, 0 deletions
diff --git a/src/librustc_typeck/check/demand.rs b/src/librustc_typeck/check/demand.rs
index 87fc90f53ab..bc36162e02f 100644
--- a/src/librustc_typeck/check/demand.rs
+++ b/src/librustc_typeck/check/demand.rs
@@ -425,6 +425,9 @@ 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()");
                         return Some(match mutability {
                             hir::Mutability::MutMutable => (
                                 sp,
diff --git a/src/test/ui/issues/issue-61106.rs b/src/test/ui/issues/issue-61106.rs
new file mode 100644
index 00000000000..308ef1de3cc
--- /dev/null
+++ b/src/test/ui/issues/issue-61106.rs
@@ -0,0 +1,6 @@
+fn main() {
+    let x = String::new();
+    foo(x.clone()); //~ ERROR mismatched types
+}
+
+fn foo(_: &str) {}
diff --git a/src/test/ui/issues/issue-61106.stderr b/src/test/ui/issues/issue-61106.stderr
new file mode 100644
index 00000000000..ca67d514928
--- /dev/null
+++ b/src/test/ui/issues/issue-61106.stderr
@@ -0,0 +1,15 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-61106.rs:3:9
+   |
+LL |     foo(x.clone());
+   |         ^^^^^^^^^
+   |         |
+   |         expected &str, found struct `std::string::String`
+   |         help: consider borrowing here: `&x`
+   |
+   = note: expected type `&str`
+              found type `std::string::String`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.