Fix incorrect disambiguation suggestion for associated items
This commit is contained in:
parent
a0648eab36
commit
3d08ff1c19
@ -178,6 +178,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
sugg_span,
|
sugg_span,
|
||||||
idx,
|
idx,
|
||||||
self.tcx.sess.source_map(),
|
self.tcx.sess.source_map(),
|
||||||
|
item.fn_has_self_parameter,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -220,6 +221,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||||||
sugg_span,
|
sugg_span,
|
||||||
idx,
|
idx,
|
||||||
self.tcx.sess.source_map(),
|
self.tcx.sess.source_map(),
|
||||||
|
item.fn_has_self_parameter,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1738,6 +1740,7 @@ fn print_disambiguation_help(
|
|||||||
span: Span,
|
span: Span,
|
||||||
candidate: Option<usize>,
|
candidate: Option<usize>,
|
||||||
source_map: &source_map::SourceMap,
|
source_map: &source_map::SourceMap,
|
||||||
|
fn_has_self_parameter: bool,
|
||||||
) {
|
) {
|
||||||
let mut applicability = Applicability::MachineApplicable;
|
let mut applicability = Applicability::MachineApplicable;
|
||||||
let (span, sugg) = if let (ty::AssocKind::Fn, Some(args)) = (kind, args) {
|
let (span, sugg) = if let (ty::AssocKind::Fn, Some(args)) = (kind, args) {
|
||||||
@ -1756,9 +1759,14 @@ fn print_disambiguation_help(
|
|||||||
.collect::<Vec<_>>()
|
.collect::<Vec<_>>()
|
||||||
.join(", "),
|
.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))
|
(span, format!("{}::{}{}", trait_name, item_name, args))
|
||||||
} else {
|
} 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(
|
err.span_suggestion_verbose(
|
||||||
span,
|
span,
|
||||||
|
@ -16,12 +16,12 @@ LL | const ID: i32 = 3;
|
|||||||
| ^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
help: disambiguate the associated constant for candidate #1
|
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
|
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
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ LL | fn foo() {}
|
|||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
help: disambiguate the associated function for candidate #1
|
help: disambiguate the associated function for candidate #1
|
||||||
|
|
|
|
||||||
LL | Trait1::foo()
|
LL | <Test as Trait1>::foo()
|
||||||
| ~~~~~~~~
|
| ~~~~~~~~~~~~~~~~~~
|
||||||
help: disambiguate the associated function for candidate #2
|
help: disambiguate the associated function for candidate #2
|
||||||
|
|
|
|
||||||
LL | Trait2::foo()
|
LL | <Test as Trait2>::foo()
|
||||||
| ~~~~~~~~
|
| ~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -16,12 +16,12 @@ LL | fn foo() {}
|
|||||||
| ^^^^^^^^
|
| ^^^^^^^^
|
||||||
help: disambiguate the associated function for candidate #1
|
help: disambiguate the associated function for candidate #1
|
||||||
|
|
|
|
||||||
LL | A::foo();
|
LL | <AB as A>::foo();
|
||||||
| ~~~
|
| ~~~~~~~~~~~
|
||||||
help: disambiguate the associated function for candidate #2
|
help: disambiguate the associated function for candidate #2
|
||||||
|
|
|
|
||||||
LL | B::foo();
|
LL | <AB as B>::foo();
|
||||||
| ~~~
|
| ~~~~~~~~~~~
|
||||||
|
|
||||||
error: aborting due to previous error
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
@ -27,16 +27,16 @@ LL | fn f9(_: usize) -> usize;
|
|||||||
candidate #3: `UnusedTrait`
|
candidate #3: `UnusedTrait`
|
||||||
help: disambiguate the associated function for candidate #1
|
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
|
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
|
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
|
error[E0599]: no method named `fff` found for struct `Myisize` in the current scope
|
||||||
--> $DIR/issue-7575.rs:62:30
|
--> $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: items from traits can only be used if the type parameter is bounded by the trait
|
||||||
help: disambiguate the associated function for the candidate
|
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
|
error: aborting due to 3 previous errors
|
||||||
|
Loading…
x
Reference in New Issue
Block a user