Skip to content

Commit

Permalink
Rollup merge of #89255 - FabianWolff:issue-88806, r=cjgillot
Browse files Browse the repository at this point in the history
Fix incorrect disambiguation suggestion for associated items

Fixes #88806. I have not added a new test case, because the erroneous behavior is already present in existing test cases.
  • Loading branch information
GuillaumeGomez committed Sep 28, 2021
2 parents e601554 + 3d08ff1 commit 48b5d11
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 20 deletions.
10 changes: 9 additions & 1 deletion compiler/rustc_typeck/src/check/method/suggest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
sugg_span,
idx,
self.tcx.sess.source_map(),
item.fn_has_self_parameter,
);
}
}
Expand Down Expand Up @@ -218,6 +219,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
sugg_span,
idx,
self.tcx.sess.source_map(),
item.fn_has_self_parameter,
);
}
}
Expand Down Expand Up @@ -1736,6 +1738,7 @@ fn print_disambiguation_help(
span: Span,
candidate: Option<usize>,
source_map: &source_map::SourceMap,
fn_has_self_parameter: bool,
) {
let mut applicability = Applicability::MachineApplicable;
let (span, sugg) = if let (ty::AssocKind::Fn, Some(args)) = (kind, args) {
Expand All @@ -1754,9 +1757,14 @@ fn print_disambiguation_help(
.collect::<Vec<_>>()
.join(", "),
);
let trait_name = if !fn_has_self_parameter {
format!("<{} as {}>", rcvr_ty, trait_name)
} else {
trait_name
};
(span, format!("{}::{}{}", trait_name, item_name, args))
} else {
(span.with_hi(item_name.span.lo()), format!("{}::", trait_name))
(span.with_hi(item_name.span.lo()), format!("<{} as {}>::", rcvr_ty, trait_name))
};
err.span_suggestion_verbose(
span,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ LL | const ID: i32 = 3;
| ^^^^^^^^^^^^^^^^^^
help: disambiguate the associated constant for candidate #1
|
LL | const X: i32 = Foo::ID;
| ~~~~~
LL | const X: i32 = <i32 as Foo>::ID;
| ~~~~~~~~~~~~~~
help: disambiguate the associated constant for candidate #2
|
LL | const X: i32 = Bar::ID;
| ~~~~~
LL | const X: i32 = <i32 as Bar>::ID;
| ~~~~~~~~~~~~~~

error: aborting due to previous error

Expand Down
8 changes: 4 additions & 4 deletions src/test/ui/error-codes/E0034.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ LL | fn foo() {}
| ^^^^^^^^
help: disambiguate the associated function for candidate #1
|
LL | Trait1::foo()
| ~~~~~~~~
LL | <Test as Trait1>::foo()
| ~~~~~~~~~~~~~~~~~~
help: disambiguate the associated function for candidate #2
|
LL | Trait2::foo()
| ~~~~~~~~
LL | <Test as Trait2>::foo()
| ~~~~~~~~~~~~~~~~~~

error: aborting due to previous error

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ LL | fn foo() {}
| ^^^^^^^^
help: disambiguate the associated function for candidate #1
|
LL | A::foo();
| ~~~
LL | <AB as A>::foo();
| ~~~~~~~~~~~
help: disambiguate the associated function for candidate #2
|
LL | B::foo();
| ~~~
LL | <AB as B>::foo();
| ~~~~~~~~~~~

error: aborting due to previous error

Expand Down
14 changes: 7 additions & 7 deletions src/test/ui/span/issue-7575.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,16 @@ LL | fn f9(_: usize) -> usize;
candidate #3: `UnusedTrait`
help: disambiguate the associated function for candidate #1
|
LL | u.f8(42) + CtxtFn::f9(u, 342) + m.fff(42)
| ~~~~~~~~~~~~~~~~~~
LL | u.f8(42) + <usize as CtxtFn>::f9(u, 342) + m.fff(42)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
help: disambiguate the associated function for candidate #2
|
LL | u.f8(42) + OtherTrait::f9(u, 342) + m.fff(42)
| ~~~~~~~~~~~~~~~~~~~~~~
LL | u.f8(42) + <usize as OtherTrait>::f9(u, 342) + m.fff(42)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
help: disambiguate the associated function for candidate #3
|
LL | u.f8(42) + UnusedTrait::f9(u, 342) + m.fff(42)
| ~~~~~~~~~~~~~~~~~~~~~~~
LL | u.f8(42) + <usize as UnusedTrait>::f9(u, 342) + m.fff(42)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

error[E0599]: no method named `fff` found for struct `Myisize` in the current scope
--> $DIR/issue-7575.rs:62:30
Expand Down Expand Up @@ -72,7 +72,7 @@ LL | fn is_str() -> bool {
= help: items from traits can only be used if the type parameter is bounded by the trait
help: disambiguate the associated function for the candidate
|
LL | ManyImplTrait::is_str(t)
LL | <T as ManyImplTrait>::is_str(t)
|

error: aborting due to 3 previous errors
Expand Down

0 comments on commit 48b5d11

Please sign in to comment.