Skip to content

Commit

Permalink
fix: correct the arg for 'suggest to use associated function syntax' …
Browse files Browse the repository at this point in the history
…diagnostic
  • Loading branch information
Young-Flash committed Dec 1, 2023
1 parent c9c760f commit e4cfe03
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 3 deletions.
8 changes: 5 additions & 3 deletions compiler/rustc_hir_typeck/src/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
16 changes: 16 additions & 0 deletions tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.fixed
Original file line number Diff line number Diff line change
@@ -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
}
16 changes: 16 additions & 0 deletions tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.rs
Original file line number Diff line number Diff line change
@@ -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
}
41 changes: 41 additions & 0 deletions tests/ui/suggestions/suggest-assoc-fn-call-without-receiver.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit e4cfe03

Please sign in to comment.