about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2023-12-08 23:15:12 +0100
committerGitHub <noreply@github.com>2023-12-08 23:15:12 +0100
commit9041d1cec0e4ee566236307f11dd0a1ef4a17841 (patch)
treea8020fc2e7769217375233448875c9c1b94da6bb
parent4df6134f1ace9b29d44b035976801fd0d9981611 (diff)
parente4cfe038adffb0cf5785d7c95f809364c6a39f5f (diff)
downloadrust-9041d1cec0e4ee566236307f11dd0a1ef4a17841.tar.gz
rust-9041d1cec0e4ee566236307f11dd0a1ef4a17841.zip
Rollup merge of #118502 - Young-Flash:fix, r=compiler-errors
fix: correct the arg for 'suggest to use associated function syntax' diagnostic

close https://github.com/rust-lang/rust/issues/118469
-rw-r--r--compiler/rustc_hir_typeck/src/method/suggest.rs8
-rw-r--r--tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.fixed16
-rw-r--r--tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.rs16
-rw-r--r--tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.stderr41
4 files changed, 78 insertions, 3 deletions
diff --git a/compiler/rustc_hir_typeck/src/method/suggest.rs b/compiler/rustc_hir_typeck/src/method/suggest.rs
index 143454c71e1..b38a6ebd501 100644
--- a/compiler/rustc_hir_typeck/src/method/suggest.rs
+++ b/compiler/rustc_hir_typeck/src/method/suggest.rs
@@ -1591,10 +1591,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
             {
                 let sig = self.tcx.fn_sig(assoc.def_id).instantiate_identity();
                 sig.inputs().skip_binder().get(0).and_then(|first| {
-                    if first.peel_refs() == rcvr_ty.peel_refs() {
-                        None
-                    } else {
+                    let impl_ty = self.tcx.type_of(*impl_did).instantiate_identity();
+                    // if the type of first arg is the same as the current impl type, we should take the first arg into assoc function
+                    if first.peel_refs() == impl_ty {
                         Some(first.ref_mutability().map_or("", |mutbl| mutbl.ref_prefix_str()))
+                    } else {
+                        None
                     }
                 })
             } else {
diff --git a/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.fixed b/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.fixed
new file mode 100644
index 00000000000..6e679134d63
--- /dev/null
+++ b/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.fixed
@@ -0,0 +1,16 @@
+// run-rustfix
+
+struct A {}
+
+impl A {
+    fn hello(_a: i32) {}
+    fn test(_a: Self, _b: i32) {}
+}
+
+fn main() {
+    let _a = A {};
+    A::hello(1);
+    //~^ ERROR no method named `hello` found
+    A::test(_a, 1);
+    //~^ ERROR no method named `test` found
+}
diff --git a/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.rs b/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.rs
new file mode 100644
index 00000000000..67c2cc1bed5
--- /dev/null
+++ b/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.rs
@@ -0,0 +1,16 @@
+// run-rustfix
+
+struct A {}
+
+impl A {
+    fn hello(_a: i32) {}
+    fn test(_a: Self, _b: i32) {}
+}
+
+fn main() {
+    let _a = A {};
+    _a.hello(1);
+    //~^ ERROR no method named `hello` found
+    _a.test(1);
+    //~^ ERROR no method named `test` found
+}
diff --git a/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.stderr b/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.stderr
new file mode 100644
index 00000000000..ed227cbab39
--- /dev/null
+++ b/tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.stderr
@@ -0,0 +1,41 @@
+error[E0599]: no method named `hello` found for struct `A` in the current scope
+  --> $DIR/suggest-assoc-fn-call-without-receiver.rs:12:8
+   |
+LL | struct A {}
+   | -------- method `hello` not found for this struct
+...
+LL |     _a.hello(1);
+   |     ---^^^^^---
+   |     |  |
+   |     |  this is an associated function, not a method
+   |     help: use associated function syntax instead: `A::hello(1)`
+   |
+   = note: found the following associated functions; to be used as methods, functions must have a `self` parameter
+note: the candidate is defined in an impl for the type `A`
+  --> $DIR/suggest-assoc-fn-call-without-receiver.rs:6:5
+   |
+LL |     fn hello(_a: i32) {}
+   |     ^^^^^^^^^^^^^^^^^
+
+error[E0599]: no method named `test` found for struct `A` in the current scope
+  --> $DIR/suggest-assoc-fn-call-without-receiver.rs:14:8
+   |
+LL | struct A {}
+   | -------- method `test` not found for this struct
+...
+LL |     _a.test(1);
+   |     ---^^^^---
+   |     |  |
+   |     |  this is an associated function, not a method
+   |     help: use associated function syntax instead: `A::test(_a, 1)`
+   |
+   = note: found the following associated functions; to be used as methods, functions must have a `self` parameter
+note: the candidate is defined in an impl for the type `A`
+  --> $DIR/suggest-assoc-fn-call-without-receiver.rs:7:5
+   |
+LL |     fn test(_a: Self, _b: i32) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0599`.