about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-09-05 09:35:17 +0000
committerbors <bors@rust-lang.org>2020-09-05 09:35:17 +0000
commit02fe30971ef397bcff3460a9aaf175e0810c2c90 (patch)
treeb6a3fc425642f8a041d6611779445efca45ab48b
parentc3364780d2cfddfe329f62a3ec138fd4f9a60e27 (diff)
parentb61eab5d514af27009769373360b57dd55036a23 (diff)
downloadrust-02fe30971ef397bcff3460a9aaf175e0810c2c90.tar.gz
rust-02fe30971ef397bcff3460a9aaf175e0810c2c90.zip
Auto merge of #75888 - GuillaumeGomez:trait-impl-assoc-const-doc-alias, r=ollie27
Add check for doc alias on assoc const in trait impl

Fixes #73721.

r? @ollie27
-rw-r--r--compiler/rustc_passes/src/check_attr.rs12
-rw-r--r--src/test/rustdoc-ui/doc-alias-assoc-const.rs22
-rw-r--r--src/test/rustdoc-ui/doc-alias-assoc-const.stderr8
3 files changed, 41 insertions, 1 deletions
diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs
index 832cde86d0b..392070839dc 100644
--- a/compiler/rustc_passes/src/check_attr.rs
+++ b/compiler/rustc_passes/src/check_attr.rs
@@ -250,13 +250,23 @@ impl CheckAttrVisitor<'tcx> {
                                     None
                                 }
                             }
+                            Target::AssocConst => {
+                                let parent_hir_id = self.tcx.hir().get_parent_item(hir_id);
+                                let containing_item = self.tcx.hir().expect_item(parent_hir_id);
+                                // We can't link to trait impl's consts.
+                                let err = "associated constant in trait implementation block";
+                                match containing_item.kind {
+                                    ItemKind::Impl { of_trait: Some(_), .. } => Some(err),
+                                    _ => None,
+                                }
+                            }
                             _ => None,
                         } {
                             self.tcx
                                 .sess
                                 .struct_span_err(
                                     meta.span(),
-                                    &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", err,),
+                                    &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", err),
                                 )
                                 .emit();
                         }
diff --git a/src/test/rustdoc-ui/doc-alias-assoc-const.rs b/src/test/rustdoc-ui/doc-alias-assoc-const.rs
new file mode 100644
index 00000000000..73e23c152f2
--- /dev/null
+++ b/src/test/rustdoc-ui/doc-alias-assoc-const.rs
@@ -0,0 +1,22 @@
+#![feature(doc_alias)]
+#![feature(trait_alias)]
+
+pub struct Foo;
+
+pub trait Bar {
+    const BAZ: u8;
+}
+
+impl Bar for Foo {
+    #[doc(alias = "CONST_BAZ")] //~ ERROR
+    const BAZ: u8 = 0;
+}
+
+impl Foo {
+    #[doc(alias = "CONST_FOO")] // ok!
+    pub const FOO: u8 = 0;
+
+    pub fn bar() -> u8 {
+        Self::FOO
+    }
+}
diff --git a/src/test/rustdoc-ui/doc-alias-assoc-const.stderr b/src/test/rustdoc-ui/doc-alias-assoc-const.stderr
new file mode 100644
index 00000000000..3c64548cc20
--- /dev/null
+++ b/src/test/rustdoc-ui/doc-alias-assoc-const.stderr
@@ -0,0 +1,8 @@
+error: `#[doc(alias = "...")]` isn't allowed on associated constant in trait implementation block
+  --> $DIR/doc-alias-assoc-const.rs:11:11
+   |
+LL |     #[doc(alias = "CONST_BAZ")]
+   |           ^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+