about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2018-11-06 11:24:48 -0800
committerEsteban Küber <esteban@kuber.com.ar>2018-11-06 11:24:48 -0800
commit46fcf1c6ad32fbc517bb99b30c692a5ca9048940 (patch)
tree45e8c90296570bec88dbae1f11d83784b486e122
parentca4fa6f567b5d8a01f7db864539a43457119a45c (diff)
downloadrust-46fcf1c6ad32fbc517bb99b30c692a5ca9048940.tar.gz
rust-46fcf1c6ad32fbc517bb99b30c692a5ca9048940.zip
Use trait impl method span when type param mismatch is due to impl Trait
-rw-r--r--src/librustc_typeck/check/compare_method.rs4
-rw-r--r--src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs15
-rw-r--r--src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr12
3 files changed, 30 insertions, 1 deletions
diff --git a/src/librustc_typeck/check/compare_method.rs b/src/librustc_typeck/check/compare_method.rs
index 54c6c8f7b93..45c5457c9e1 100644
--- a/src/librustc_typeck/check/compare_method.rs
+++ b/src/librustc_typeck/check/compare_method.rs
@@ -595,7 +595,9 @@ fn compare_number_of_generics<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
     if num_impl_m_type_params != num_trait_m_type_params {
         let impl_m_node_id = tcx.hir.as_local_node_id(impl_m.def_id).unwrap();
         let impl_m_item = tcx.hir.expect_impl_item(impl_m_node_id);
-        let span = if impl_m_item.generics.params.is_empty() {
+        let span = if impl_m_item.generics.params.is_empty()
+            || impl_m_item.generics.span.is_dummy()  // impl Trait in argument position (#55374)
+        {
             impl_m_span
         } else {
             impl_m_item.generics.span
diff --git a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs
new file mode 100644
index 00000000000..4a71932d1df
--- /dev/null
+++ b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.rs
@@ -0,0 +1,15 @@
+trait Foo {
+    type T;
+    fn foo(&self, t: Self::T);
+//~^ NOTE expected 0 type parameters
+}
+
+impl Foo for u32 {
+    type T = ();
+
+    fn foo(&self, t: impl Clone) {}
+//~^ ERROR method `foo` has 1 type parameter but its trait declaration has 0 type parameters
+//~| NOTE found 1 type parameter
+}
+
+fn main() {}
diff --git a/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr
new file mode 100644
index 00000000000..af7fdde9a8e
--- /dev/null
+++ b/src/test/ui/issues/type-arg-mismatch-due-to-impl-trait.stderr
@@ -0,0 +1,12 @@
+error[E0049]: method `foo` has 1 type parameter but its trait declaration has 0 type parameters
+  --> $DIR/type-arg-mismatch-due-to-impl-trait.rs:10:5
+   |
+LL |     fn foo(&self, t: Self::T);
+   |     -------------------------- expected 0 type parameters
+...
+LL |     fn foo(&self, t: impl Clone) {}
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found 1 type parameter
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0049`.