Rollup merge of #89255 - FabianWolff:issue-88806, r=cjgillot

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.
This commit is contained in:
Guillaume Gomez 2021-09-28 20:00:16 +02:00 committed by GitHub
commit 48b5d110ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 20 deletions

View File

@ -176,6 +176,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
sugg_span,
idx,
self.tcx.sess.source_map(),
item.fn_has_self_parameter,
);
}
}
@ -218,6 +219,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
sugg_span,
idx,
self.tcx.sess.source_map(),
item.fn_has_self_parameter,
);
}
}
@ -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) {
@ -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,

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
@ -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