about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBruno Felipe Francisco <bruno.francisco@ifood.com.br>2022-04-13 11:02:01 -0300
committerBruno Felipe Francisco <bruno.francisco@ifood.com.br>2022-04-13 11:02:01 -0300
commit9b9f6771049ecd30f13138c32f23ba6562a613d5 (patch)
tree631d3731f933e141e2eeaacd7bbb367ef151a9e5
parente3c43e64eceb00e13b1932229aa9b2d774e6af96 (diff)
downloadrust-9b9f6771049ecd30f13138c32f23ba6562a613d5.tar.gz
rust-9b9f6771049ecd30f13138c32f23ba6562a613d5.zip
fix: wrong trait import suggestion for T:
-rw-r--r--compiler/rustc_typeck/src/check/method/suggest.rs10
-rw-r--r--src/test/ui/traits/issue-95898.rs9
-rw-r--r--src/test/ui/traits/issue-95898.stderr15
3 files changed, 32 insertions, 2 deletions
diff --git a/compiler/rustc_typeck/src/check/method/suggest.rs b/compiler/rustc_typeck/src/check/method/suggest.rs
index ecc29965937..e6560ca4d9b 100644
--- a/compiler/rustc_typeck/src/check/method/suggest.rs
+++ b/compiler/rustc_typeck/src/check/method/suggest.rs
@@ -1880,9 +1880,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                                 };
                             let sp = hir.span(id);
                             let sp = if let Some(first_bound) = has_bounds {
-                                // `sp` only covers `T`, change it so that it covers
-                                // `T:` when appropriate
                                 sp.until(first_bound.span())
+                            } else if let Some(colon_sp) =
+                                // If the generic param is declared with a colon but without bounds:
+                                // fn foo<T:>(t: T) { ... }
+                                param.colon_span_for_suggestions(
+                                    self.inh.tcx.sess.source_map(),
+                                )
+                            {
+                                sp.to(colon_sp)
                             } else {
                                 sp
                             };
diff --git a/src/test/ui/traits/issue-95898.rs b/src/test/ui/traits/issue-95898.rs
new file mode 100644
index 00000000000..41a20b89959
--- /dev/null
+++ b/src/test/ui/traits/issue-95898.rs
@@ -0,0 +1,9 @@
+// Test for #95898: The trait suggestion had an extra `:` after the trait.
+// edition:2021
+
+fn foo<T:>(t: T) {
+    t.clone();
+    //~^ ERROR no method named `clone` found for type parameter `T` in the current scope
+}
+
+fn main() {}
diff --git a/src/test/ui/traits/issue-95898.stderr b/src/test/ui/traits/issue-95898.stderr
new file mode 100644
index 00000000000..d7d47905396
--- /dev/null
+++ b/src/test/ui/traits/issue-95898.stderr
@@ -0,0 +1,15 @@
+error[E0599]: no method named `clone` found for type parameter `T` in the current scope
+  --> $DIR/issue-95898.rs:5:7
+   |
+LL |     t.clone();
+   |       ^^^^^ method not found in `T`
+   |
+   = help: items from traits can only be used if the type parameter is bounded by the trait
+help: the following trait defines an item `clone`, perhaps you need to restrict type parameter `T` with it:
+   |
+LL | fn foo<T: Clone>(t: T) {
+   |        ~~~~~~~~
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0599`.