Point at assoc fn definition on type param divergence

When the number of type parameters in the associated function of an impl
and its trait differ, we now *always* point at the trait one, even if it
comes from a foreign crate. When it is local, we point at the specific
params, when it is foreign, we point at the whole associated item.

Fix #69944.
This commit is contained in:
Esteban Küber 2023-10-20 22:11:01 +00:00
parent cc705b8012
commit 939a224ce3
2 changed files with 11 additions and 20 deletions

View File

@ -1557,38 +1557,24 @@ fn compare_number_of_generics<'tcx>(
DiagnosticId::Error("E0049".into()),
);
let mut suffix = None;
let msg =
format!("expected {trait_count} {kind} parameter{}", pluralize!(trait_count),);
if let Some(spans) = trait_spans {
let mut spans = spans.iter();
if let Some(span) = spans.next() {
err.span_label(
*span,
format!(
"expected {} {} parameter{}",
trait_count,
kind,
pluralize!(trait_count),
),
);
err.span_label(*span, msg);
}
for span in spans {
err.span_label(*span, "");
}
} else {
suffix = Some(format!(", expected {trait_count}"));
err.span_label(tcx.def_span(trait_.def_id), msg);
}
if let Some(span) = span {
err.span_label(
span,
format!(
"found {} {} parameter{}{}",
impl_count,
kind,
pluralize!(impl_count),
suffix.unwrap_or_default(),
),
format!("found {} {} parameter{}", impl_count, kind, pluralize!(impl_count),),
);
}

View File

@ -2,7 +2,12 @@ error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0
--> $DIR/issue-36708.rs:8:12
|
LL | fn foo<T>() {}
| ^ found 1 type parameter, expected 0
| ^ found 1 type parameter
|
::: $DIR/auxiliary/issue-36708.rs:4:5
|
LL | fn foo();
| --------- expected 0 type parameters
error: aborting due to previous error