about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCorey Farwell <coreyf@rwell.org>2018-08-17 08:23:42 -0700
committerGitHub <noreply@github.com>2018-08-17 08:23:42 -0700
commit4cdcb23581022b5e2aa4e220a6c0566f8908825d (patch)
tree2720d647f24ba66db78618a511ed0edf5a721914
parentf0764433f7551afe4ba29c409abad48e121ab69f (diff)
parent5a0a38a46f325512f00809ba5406c1fd6b3dae49 (diff)
downloadrust-4cdcb23581022b5e2aa4e220a6c0566f8908825d.tar.gz
rust-4cdcb23581022b5e2aa4e220a6c0566f8908825d.zip
Rollup merge of #53406 - estebank:to_string-to_string, r=michaelwoerister
Do not suggest conversion method that is already there

Fix #53348.
-rw-r--r--src/librustc_typeck/check/mod.rs10
-rw-r--r--src/test/ui/issues/issue-53348.rs26
-rw-r--r--src/test/ui/issues/issue-53348.stderr12
3 files changed, 46 insertions, 2 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 43edb235044..4fac11189a4 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -4629,8 +4629,14 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
             let methods = self.get_conversion_methods(expr.span, expected, found);
             if let Ok(expr_text) = self.sess().codemap().span_to_snippet(expr.span) {
                 let suggestions = iter::repeat(expr_text).zip(methods.iter())
-                    .map(|(receiver, method)| format!("{}.{}()", receiver, method.ident))
-                    .collect::<Vec<_>>();
+                    .filter_map(|(receiver, method)| {
+                        let method_call = format!(".{}()", method.ident);
+                        if receiver.ends_with(&method_call) {
+                            None  // do not suggest code that is already there (#53348)
+                        } else {
+                            Some(format!("{}{}", receiver, method_call))
+                        }
+                    }) .collect::<Vec<_>>();
                 if !suggestions.is_empty() {
                     err.span_suggestions(expr.span, "try using a conversion method", suggestions);
                 }
diff --git a/src/test/ui/issues/issue-53348.rs b/src/test/ui/issues/issue-53348.rs
new file mode 100644
index 00000000000..46ab07dad6e
--- /dev/null
+++ b/src/test/ui/issues/issue-53348.rs
@@ -0,0 +1,26 @@
+// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+fn main() {
+    let mut v = vec!["hello", "this", "is", "a", "test"];
+
+    let v2 = Vec::new();
+
+    v.into_iter().map(|s|s.to_owned()).collect::<Vec<_>>();
+
+    let mut a = String::new();
+    for i in v {
+        a = *i.to_string();
+        //~^ ERROR mismatched types
+        //~| NOTE expected struct `std::string::String`, found str
+        //~| NOTE expected type
+        v2.push(a);
+    }
+}
diff --git a/src/test/ui/issues/issue-53348.stderr b/src/test/ui/issues/issue-53348.stderr
new file mode 100644
index 00000000000..9aab4928ffa
--- /dev/null
+++ b/src/test/ui/issues/issue-53348.stderr
@@ -0,0 +1,12 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-53348.rs:20:13
+   |
+LL |         a = *i.to_string();
+   |             ^^^^^^^^^^^^^^ expected struct `std::string::String`, found str
+   |
+   = note: expected type `std::string::String`
+              found type `str`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.