about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustdoc/visit_ast.rs30
-rw-r--r--src/test/rustdoc-ui/check-doc-alias-attr-location.rs16
-rw-r--r--src/test/rustdoc-ui/check-doc-alias-attr-location.stderr20
3 files changed, 57 insertions, 9 deletions
diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs
index e1a84e99836..4f347f2055e 100644
--- a/src/librustdoc/visit_ast.rs
+++ b/src/librustdoc/visit_ast.rs
@@ -591,8 +591,14 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
                 // Don't duplicate impls when inlining or if it's implementing a trait, we'll pick
                 // them up regardless of where they're located.
                 if !self.inlining && of_trait.is_none() {
-                    let items =
-                        items.iter().map(|item| self.cx.tcx.hir().impl_item(item.id)).collect();
+                    let items = items
+                        .iter()
+                        .map(|item| {
+                            let item = self.cx.tcx.hir().impl_item(item.id);
+                            self.check_impl_doc_alias_attr(item);
+                            item
+                        })
+                        .collect();
                     let i = Impl {
                         unsafety,
                         polarity,
@@ -608,11 +614,31 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
                         vis: &item.vis,
                     };
                     om.impls.push(i);
+                } else if of_trait.is_some() {
+                    for item in items.iter() {
+                        self.check_impl_doc_alias_attr(self.cx.tcx.hir().impl_item(item.id));
+                    }
                 }
             }
         }
     }
 
+    fn check_impl_doc_alias_attr(&self, item: &hir::ImplItem<'_>) {
+        match item.kind {
+            hir::ImplItemKind::Const(_, _) => check_doc_alias_attrs(
+                &item.attrs,
+                "const in implementation block",
+                self.cx.sess().diagnostic(),
+            ),
+            hir::ImplItemKind::TyAlias(_) => check_doc_alias_attrs(
+                &item.attrs,
+                "type alias in implementation block",
+                self.cx.sess().diagnostic(),
+            ),
+            hir::ImplItemKind::Fn(_, _) => {}
+        }
+    }
+
     fn visit_foreign_item(
         &mut self,
         item: &'tcx hir::ForeignItem<'_>,
diff --git a/src/test/rustdoc-ui/check-doc-alias-attr-location.rs b/src/test/rustdoc-ui/check-doc-alias-attr-location.rs
index e209da6e2c3..8a97cf7f8e8 100644
--- a/src/test/rustdoc-ui/check-doc-alias-attr-location.rs
+++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.rs
@@ -1,13 +1,23 @@
 #![feature(doc_alias)]
 
 pub struct Bar;
-pub trait Foo {}
+pub trait Foo {
+    type X;
+    fn foo() -> Self::X;
+}
 
 #[doc(alias = "foo")] //~ ERROR
 extern {}
 
 #[doc(alias = "bar")] //~ ERROR
-impl Bar {}
+impl Bar {
+    #[doc(alias = "const")] //~ ERROR
+    const A: u32 = 0;
+}
 
 #[doc(alias = "foobar")] //~ ERROR
-impl Foo for Bar {}
+impl Foo for Bar {
+    #[doc(alias = "assoc")] //~ ERROR
+    type X = i32;
+    fn foo() -> Self::X { 0 }
+}
diff --git a/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr
index 74adc1bc073..5fe943debde 100644
--- a/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr
+++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr
@@ -1,20 +1,32 @@
 error: `#[doc(alias = "...")]` isn't allowed on extern block
-  --> $DIR/check-doc-alias-attr-location.rs:6:7
+  --> $DIR/check-doc-alias-attr-location.rs:9:7
    |
 LL | #[doc(alias = "foo")]
    |       ^^^^^^^^^^^^^
 
 error: `#[doc(alias = "...")]` isn't allowed on implementation block
-  --> $DIR/check-doc-alias-attr-location.rs:9:7
+  --> $DIR/check-doc-alias-attr-location.rs:12:7
    |
 LL | #[doc(alias = "bar")]
    |       ^^^^^^^^^^^^^
 
+error: `#[doc(alias = "...")]` isn't allowed on const in implementation block
+  --> $DIR/check-doc-alias-attr-location.rs:14:11
+   |
+LL |     #[doc(alias = "const")]
+   |           ^^^^^^^^^^^^^^^
+
 error: `#[doc(alias = "...")]` isn't allowed on implementation block
-  --> $DIR/check-doc-alias-attr-location.rs:12:7
+  --> $DIR/check-doc-alias-attr-location.rs:18:7
    |
 LL | #[doc(alias = "foobar")]
    |       ^^^^^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: `#[doc(alias = "...")]` isn't allowed on type alias in implementation block
+  --> $DIR/check-doc-alias-attr-location.rs:20:11
+   |
+LL |     #[doc(alias = "assoc")]
+   |           ^^^^^^^^^^^^^^^
+
+error: aborting due to 5 previous errors