Skip to content

Commit 0754c84

Browse files
committed
Explain that impl Trait introduces an implicit type argument
1 parent 2885947 commit 0754c84

File tree

3 files changed

+33
-8
lines changed

3 files changed

+33
-8
lines changed

src/librustc_typeck/check/compare_method.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -600,20 +600,37 @@ fn compare_number_of_generics<'a, 'tcx>(
600600
if impl_count != trait_count {
601601
err_occurred = true;
602602

603-
let trait_spans = if let Some(trait_hir_id) = tcx.hir().as_local_hir_id(trait_.def_id) {
603+
let (
604+
trait_spans,
605+
impl_trait_spans,
606+
) = if let Some(trait_hir_id) = tcx.hir().as_local_hir_id(trait_.def_id) {
604607
let trait_item = tcx.hir().expect_trait_item(trait_hir_id);
605-
Some(if trait_item.generics.params.is_empty() {
606-
vec![trait_item.generics.span]
608+
if trait_item.generics.params.is_empty() {
609+
(Some(vec![trait_item.generics.span]), vec![])
607610
} else {
608-
trait_item.generics.params.iter().map(|p| p.span).collect::<Vec<Span>>()
609-
})
611+
let arg_spans: Vec<Span> = trait_item.generics.params.iter()
612+
.map(|p| p.span)
613+
.collect();
614+
let impl_trait_spans: Vec<Span> = trait_item.generics.params.iter()
615+
.filter_map(|p| if !trait_item.generics.span.overlaps(p.span) {
616+
Some(p.span)
617+
} else {
618+
None
619+
}).collect();
620+
(Some(arg_spans), impl_trait_spans)
621+
}
610622
} else {
611-
trait_span.map(|s| vec![s])
623+
(trait_span.map(|s| vec![s]), vec![])
612624
};
613625

614626
let impl_hir_id = tcx.hir().as_local_hir_id(impl_.def_id).unwrap();
615627
let impl_item = tcx.hir().expect_impl_item(impl_hir_id);
616-
// let span = impl_item.generics.span;
628+
let impl_item_impl_trait_spans: Vec<Span> = impl_item.generics.params.iter()
629+
.filter_map(|p| if !impl_item.generics.span.overlaps(p.span) {
630+
Some(p.span)
631+
} else {
632+
None
633+
}).collect();
617634
let spans = impl_item.generics.spans();
618635
let span = spans.primary_span();
619636

@@ -661,6 +678,10 @@ fn compare_number_of_generics<'a, 'tcx>(
661678
));
662679
}
663680

681+
for span in impl_trait_spans.iter().chain(impl_item_impl_trait_spans.iter()) {
682+
err.span_label(*span, "`impl Trait` introduces an implicit type parameter");
683+
}
684+
664685
err.emit();
665686
}
666687
}

src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ impl Foo for u32 {
1010
fn foo(&self, t: impl Clone) {}
1111
//~^ ERROR method `foo` has 1 type parameter but its trait declaration has 0 type parameters
1212
//~| NOTE found 1 type parameter
13+
//~| NOTE `impl Trait` introduces an implicit type parameter
1314
}
1415

1516
fn main() {}

src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ LL | fn foo(&self, t: Self::T);
55
| - expected 0 type parameters
66
...
77
LL | fn foo(&self, t: impl Clone) {}
8-
| ^^^^^^^^^^ found 1 type parameter
8+
| ^^^^^^^^^^
9+
| |
10+
| found 1 type parameter
11+
| `impl Trait` introduces an implicit type parameter
912

1013
error: aborting due to previous error
1114

0 commit comments

Comments
 (0)