From 213dc41fe7e9e4ab56a58d7048deaa658015bc44 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 6 Jul 2020 16:11:12 +0200 Subject: [PATCH 1/7] Add checks for doc alias on which item it's used --- src/librustdoc/visit_ast.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index cf57ffd0b4b30..e1a84e99836e3 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -31,6 +31,27 @@ fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec { std::iter::once(crate_name).chain(relative).collect() } +fn check_doc_alias_attrs( + attrs: &[ast::Attribute], + item_kind: &str, + diagnostic: &::rustc_errors::Handler, +) { + for attr in attrs { + if let Some(attr) = attr.meta() { + if let Some(list) = attr.meta_item_list() { + for meta in list { + if meta.check_name(sym::alias) { + diagnostic.span_err( + meta.span(), + &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", item_kind), + ); + } + } + } + } + } +} + // Also, is there some reason that this doesn't use the 'visit' // framework from syntax?. @@ -387,6 +408,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { match item.kind { hir::ItemKind::ForeignMod(ref fm) => { + check_doc_alias_attrs(&item.attrs, "extern block", self.cx.sess().diagnostic()); for item in fm.items { self.visit_foreign_item(item, None, om); } @@ -561,6 +583,11 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { self_ty, ref items, } => { + check_doc_alias_attrs( + &item.attrs, + "implementation block", + self.cx.sess().diagnostic(), + ); // 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() { From 23a2ba6e53cd5cd8c4cc2f75cc1e7d2ac20d9cbc Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Mon, 6 Jul 2020 16:11:32 +0200 Subject: [PATCH 2/7] Add more tests for doc alias --- .../check-doc-alias-attr-location.rs | 13 ++++++++++++ .../check-doc-alias-attr-location.stderr | 20 +++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 src/test/rustdoc-ui/check-doc-alias-attr-location.rs create mode 100644 src/test/rustdoc-ui/check-doc-alias-attr-location.stderr diff --git a/src/test/rustdoc-ui/check-doc-alias-attr-location.rs b/src/test/rustdoc-ui/check-doc-alias-attr-location.rs new file mode 100644 index 0000000000000..e209da6e2c3ae --- /dev/null +++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.rs @@ -0,0 +1,13 @@ +#![feature(doc_alias)] + +pub struct Bar; +pub trait Foo {} + +#[doc(alias = "foo")] //~ ERROR +extern {} + +#[doc(alias = "bar")] //~ ERROR +impl Bar {} + +#[doc(alias = "foobar")] //~ ERROR +impl Foo for Bar {} diff --git a/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr new file mode 100644 index 0000000000000..74adc1bc07399 --- /dev/null +++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr @@ -0,0 +1,20 @@ +error: `#[doc(alias = "...")]` isn't allowed on extern block + --> $DIR/check-doc-alias-attr-location.rs:6:7 + | +LL | #[doc(alias = "foo")] + | ^^^^^^^^^^^^^ + +error: `#[doc(alias = "...")]` isn't allowed on implementation block + --> $DIR/check-doc-alias-attr-location.rs:9:7 + | +LL | #[doc(alias = "bar")] + | ^^^^^^^^^^^^^ + +error: `#[doc(alias = "...")]` isn't allowed on implementation block + --> $DIR/check-doc-alias-attr-location.rs:12:7 + | +LL | #[doc(alias = "foobar")] + | ^^^^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors + From b04fda8b6971c5a2541b02e0498196beb4642728 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Thu, 23 Jul 2020 21:04:54 +0200 Subject: [PATCH 3/7] Add doc(alias) attribute checks for associated consts and associated types --- src/librustdoc/visit_ast.rs | 30 +++++++++++++++++-- .../check-doc-alias-attr-location.rs | 16 ++++++++-- .../check-doc-alias-attr-location.stderr | 20 ++++++++++--- 3 files changed, 57 insertions(+), 9 deletions(-) diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index e1a84e99836e3..4f347f2055e89 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 e209da6e2c3ae..8a97cf7f8e892 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 74adc1bc07399..5fe943debdeb0 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 From 9d252ba9289bbeec8c8d3477245aea0641637374 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Thu, 23 Jul 2020 21:50:28 +0200 Subject: [PATCH 4/7] Remove invalid #[doc(alias)] from doc-alias search-index test --- src/test/rustdoc-js/doc-alias.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/rustdoc-js/doc-alias.rs b/src/test/rustdoc-js/doc-alias.rs index 84c638a199507..28a720d06e8d3 100644 --- a/src/test/rustdoc-js/doc-alias.rs +++ b/src/test/rustdoc-js/doc-alias.rs @@ -12,11 +12,7 @@ impl Struct { } impl Trait for Struct { - // Shouldn't be listed in aliases! - #[doc(alias = "ImplTraitItem")] type Target = u32; - // Shouldn't be listed in aliases! - #[doc(alias = "ImplAssociatedConstItem")] const AssociatedConst: i32 = 12; #[doc(alias = "ImplTraitFunction")] From 51db2a65dd2fd9e1492a169bff424c0eae258517 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 1 Aug 2020 16:22:20 +0200 Subject: [PATCH 5/7] Put back attributes check pass in rustdoc --- src/librustdoc/core.rs | 4 ++++ src/test/rustdoc-ui/check-doc-alias-attr.rs | 10 ++++++++++ .../rustdoc-ui/check-doc-alias-attr.stderr | 20 +++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 src/test/rustdoc-ui/check-doc-alias-attr.rs create mode 100644 src/test/rustdoc-ui/check-doc-alias-attr.stderr diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index b13acaae1bf23..f7c6a18a0e896 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -470,6 +470,10 @@ pub fn run_core(options: RustdocOptions) -> (clean::Crate, RenderInfo, RenderOpt sess.time("missing_docs", || { rustc_lint::check_crate(tcx, rustc_lint::builtin::MissingDoc::new); }); + for &module in tcx.hir().krate().modules.keys() { + let local_def_id = tcx.hir().local_def_id(module); + tcx.ensure().check_mod_attrs(local_def_id); + } let access_levels = tcx.privacy_access_levels(LOCAL_CRATE); // Convert from a HirId set to a DefId set since we don't always have easy access diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.rs b/src/test/rustdoc-ui/check-doc-alias-attr.rs new file mode 100644 index 0000000000000..b02cc1a4545b1 --- /dev/null +++ b/src/test/rustdoc-ui/check-doc-alias-attr.rs @@ -0,0 +1,10 @@ +#![crate_type = "lib"] +#![feature(doc_alias)] + +#[doc(alias = "foo")] // ok! +pub struct Bar; + +#[doc(alias)] //~ ERROR +#[doc(alias = 0)] //~ ERROR +#[doc(alias("bar"))] //~ ERROR +pub struct Foo; diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.stderr b/src/test/rustdoc-ui/check-doc-alias-attr.stderr new file mode 100644 index 0000000000000..268230ab44a0a --- /dev/null +++ b/src/test/rustdoc-ui/check-doc-alias-attr.stderr @@ -0,0 +1,20 @@ +error: doc alias attribute expects a string: #[doc(alias = "0")] + --> $DIR/check-doc-alias-attr.rs:7:7 + | +LL | #[doc(alias)] + | ^^^^^ + +error: doc alias attribute expects a string: #[doc(alias = "0")] + --> $DIR/check-doc-alias-attr.rs:8:7 + | +LL | #[doc(alias = 0)] + | ^^^^^^^^^ + +error: doc alias attribute expects a string: #[doc(alias = "0")] + --> $DIR/check-doc-alias-attr.rs:9:7 + | +LL | #[doc(alias("bar"))] + | ^^^^^^^^^^^^ + +error: aborting due to 3 previous errors + From 3b6e4a84f92995f75cd2ab26b9b15eb508f85336 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 1 Aug 2020 17:37:30 +0200 Subject: [PATCH 6/7] Move #[doc(alias)] attribute checks in rustc --- src/librustc_passes/check_attr.rs | 30 +++++++++- src/librustdoc/visit_ast.rs | 57 +------------------ .../check-doc-alias-attr-location.stderr | 12 ++-- src/test/ui/check-doc-alias-attr-location.rs | 24 ++++++++ .../ui/check-doc-alias-attr-location.stderr | 32 +++++++++++ 5 files changed, 92 insertions(+), 63 deletions(-) create mode 100644 src/test/ui/check-doc-alias-attr-location.rs create mode 100644 src/test/ui/check-doc-alias-attr-location.stderr diff --git a/src/librustc_passes/check_attr.rs b/src/librustc_passes/check_attr.rs index d438fe35ff488..a729bb5511005 100644 --- a/src/librustc_passes/check_attr.rs +++ b/src/librustc_passes/check_attr.rs @@ -70,7 +70,7 @@ impl CheckAttrVisitor<'tcx> { } else if self.tcx.sess.check_name(attr, sym::track_caller) { self.check_track_caller(&attr.span, attrs, span, target) } else if self.tcx.sess.check_name(attr, sym::doc) { - self.check_doc_alias(attr) + self.check_doc_alias(attr, hir_id, target) } else { true }; @@ -217,7 +217,7 @@ impl CheckAttrVisitor<'tcx> { } } - fn check_doc_alias(&self, attr: &Attribute) -> bool { + fn check_doc_alias(&self, attr: &Attribute, hir_id: HirId, target: Target) -> bool { if let Some(mi) = attr.meta() { if let Some(list) = mi.meta_item_list() { for meta in list { @@ -238,6 +238,32 @@ impl CheckAttrVisitor<'tcx> { .emit(); return false; } + if let Some(err) = match target { + Target::Impl => Some("implementation block"), + Target::ForeignMod => Some("extern block"), + Target::AssocConst | Target::AssocTy => { + let parent_hir_id = self.tcx.hir().get_parent_item(hir_id); + let containing_item = self.tcx.hir().expect_item(parent_hir_id); + if Target::from_item(containing_item) == Target::Impl { + Some(if target == Target::AssocConst { + "const in implementation block" + } else { + "type alias in implementation block" + }) + } else { + None + } + } + _ => None, + } { + self.tcx + .sess + .struct_span_err( + meta.span(), + &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", err,), + ) + .emit(); + } } } } diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 4f347f2055e89..cf57ffd0b4b30 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -31,27 +31,6 @@ fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec { std::iter::once(crate_name).chain(relative).collect() } -fn check_doc_alias_attrs( - attrs: &[ast::Attribute], - item_kind: &str, - diagnostic: &::rustc_errors::Handler, -) { - for attr in attrs { - if let Some(attr) = attr.meta() { - if let Some(list) = attr.meta_item_list() { - for meta in list { - if meta.check_name(sym::alias) { - diagnostic.span_err( - meta.span(), - &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", item_kind), - ); - } - } - } - } - } -} - // Also, is there some reason that this doesn't use the 'visit' // framework from syntax?. @@ -408,7 +387,6 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { match item.kind { hir::ItemKind::ForeignMod(ref fm) => { - check_doc_alias_attrs(&item.attrs, "extern block", self.cx.sess().diagnostic()); for item in fm.items { self.visit_foreign_item(item, None, om); } @@ -583,22 +561,11 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { self_ty, ref items, } => { - check_doc_alias_attrs( - &item.attrs, - "implementation block", - self.cx.sess().diagnostic(), - ); // 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| { - let item = self.cx.tcx.hir().impl_item(item.id); - self.check_impl_doc_alias_attr(item); - item - }) - .collect(); + let items = + items.iter().map(|item| self.cx.tcx.hir().impl_item(item.id)).collect(); let i = Impl { unsafety, polarity, @@ -614,31 +581,11 @@ 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.stderr b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr index 5fe943debdeb0..cc51101c16455 100644 --- a/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr +++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr @@ -10,18 +10,18 @@ error: `#[doc(alias = "...")]` isn't allowed on implementation block 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:18:7 | LL | #[doc(alias = "foobar")] | ^^^^^^^^^^^^^^^^ +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 type alias in implementation block --> $DIR/check-doc-alias-attr-location.rs:20:11 | diff --git a/src/test/ui/check-doc-alias-attr-location.rs b/src/test/ui/check-doc-alias-attr-location.rs new file mode 100644 index 0000000000000..9f0b1dcf44af2 --- /dev/null +++ b/src/test/ui/check-doc-alias-attr-location.rs @@ -0,0 +1,24 @@ +#![crate_type="lib"] +#![feature(doc_alias)] + +pub struct Bar; +pub trait Foo { + type X; + fn foo() -> Self::X; +} + +#[doc(alias = "foo")] //~ ERROR +extern {} + +#[doc(alias = "bar")] //~ ERROR +impl Bar { + #[doc(alias = "const")] //~ ERROR + const A: u32 = 0; +} + +#[doc(alias = "foobar")] //~ ERROR +impl Foo for Bar { + #[doc(alias = "assoc")] //~ ERROR + type X = i32; + fn foo() -> Self::X { 0 } +} diff --git a/src/test/ui/check-doc-alias-attr-location.stderr b/src/test/ui/check-doc-alias-attr-location.stderr new file mode 100644 index 0000000000000..b4a0847a002ba --- /dev/null +++ b/src/test/ui/check-doc-alias-attr-location.stderr @@ -0,0 +1,32 @@ +error: `#[doc(alias = "...")]` isn't allowed on extern block + --> $DIR/check-doc-alias-attr-location.rs:10:7 + | +LL | #[doc(alias = "foo")] + | ^^^^^^^^^^^^^ + +error: `#[doc(alias = "...")]` isn't allowed on implementation block + --> $DIR/check-doc-alias-attr-location.rs:13:7 + | +LL | #[doc(alias = "bar")] + | ^^^^^^^^^^^^^ + +error: `#[doc(alias = "...")]` isn't allowed on implementation block + --> $DIR/check-doc-alias-attr-location.rs:19:7 + | +LL | #[doc(alias = "foobar")] + | ^^^^^^^^^^^^^^^^ + +error: `#[doc(alias = "...")]` isn't allowed on const in implementation block + --> $DIR/check-doc-alias-attr-location.rs:15:11 + | +LL | #[doc(alias = "const")] + | ^^^^^^^^^^^^^^^ + +error: `#[doc(alias = "...")]` isn't allowed on type alias in implementation block + --> $DIR/check-doc-alias-attr-location.rs:21:11 + | +LL | #[doc(alias = "assoc")] + | ^^^^^^^^^^^^^^^ + +error: aborting due to 5 previous errors + From fc6fb3fb8ff4589bf766e09670b1e0b005581500 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 12 Aug 2020 00:12:49 +0200 Subject: [PATCH 7/7] Allow #[doc(alias)] on impl const items --- src/librustc_passes/check_attr.rs | 8 ++------ src/test/rustdoc-js/doc-alias.js | 18 +++++++++++++++--- src/test/rustdoc-js/doc-alias.rs | 2 ++ .../check-doc-alias-attr-location.rs | 4 ++-- .../check-doc-alias-attr-location.stderr | 8 +------- src/test/ui/check-doc-alias-attr-location.rs | 2 +- .../ui/check-doc-alias-attr-location.stderr | 8 +------- 7 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/librustc_passes/check_attr.rs b/src/librustc_passes/check_attr.rs index a729bb5511005..62ba412cb4192 100644 --- a/src/librustc_passes/check_attr.rs +++ b/src/librustc_passes/check_attr.rs @@ -241,15 +241,11 @@ impl CheckAttrVisitor<'tcx> { if let Some(err) = match target { Target::Impl => Some("implementation block"), Target::ForeignMod => Some("extern block"), - Target::AssocConst | Target::AssocTy => { + Target::AssocTy => { let parent_hir_id = self.tcx.hir().get_parent_item(hir_id); let containing_item = self.tcx.hir().expect_item(parent_hir_id); if Target::from_item(containing_item) == Target::Impl { - Some(if target == Target::AssocConst { - "const in implementation block" - } else { - "type alias in implementation block" - }) + Some("type alias in implementation block") } else { None } diff --git a/src/test/rustdoc-js/doc-alias.js b/src/test/rustdoc-js/doc-alias.js index 896808d415780..ff188d5145801 100644 --- a/src/test/rustdoc-js/doc-alias.js +++ b/src/test/rustdoc-js/doc-alias.js @@ -5,7 +5,7 @@ const QUERY = [ 'StructFieldItem', 'StructMethodItem', 'ImplTraitItem', - 'ImplAssociatedConstItem', + 'StructImplConstItem', 'ImplTraitFunction', 'EnumItem', 'VariantItem', @@ -64,8 +64,16 @@ const EXPECTED = [ 'others': [], }, { - // ImplAssociatedConstItem - 'others': [], + // StructImplConstItem + 'others': [ + { + 'path': 'doc_alias::Struct', + 'name': 'ImplConstItem', + 'alias': 'StructImplConstItem', + 'href': '../doc_alias/struct.Struct.html#associatedconstant.ImplConstItem', + 'is_alias': true + }, + ], }, { 'others': [ @@ -197,6 +205,10 @@ const EXPECTED = [ 'href': '../doc_alias/constant.Const.html', 'is_alias': true }, + { + 'path': 'doc_alias::Struct', + 'name': 'ImplConstItem', + }, ], }, { diff --git a/src/test/rustdoc-js/doc-alias.rs b/src/test/rustdoc-js/doc-alias.rs index 28a720d06e8d3..41caa98643cdd 100644 --- a/src/test/rustdoc-js/doc-alias.rs +++ b/src/test/rustdoc-js/doc-alias.rs @@ -7,6 +7,8 @@ pub struct Struct { } impl Struct { + #[doc(alias = "StructImplConstItem")] + pub const ImplConstItem: i32 = 0; #[doc(alias = "StructMethodItem")] pub fn method(&self) {} } 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 8a97cf7f8e892..545964c7bd61b 100644 --- a/src/test/rustdoc-ui/check-doc-alias-attr-location.rs +++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.rs @@ -11,8 +11,8 @@ extern {} #[doc(alias = "bar")] //~ ERROR impl Bar { - #[doc(alias = "const")] //~ ERROR - const A: u32 = 0; + #[doc(alias = "const")] + pub const A: u32 = 0; } #[doc(alias = "foobar")] //~ ERROR 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 cc51101c16455..a66e9939eaf18 100644 --- a/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr +++ b/src/test/rustdoc-ui/check-doc-alias-attr-location.stderr @@ -16,17 +16,11 @@ error: `#[doc(alias = "...")]` isn't allowed on implementation block LL | #[doc(alias = "foobar")] | ^^^^^^^^^^^^^^^^ -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 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 +error: aborting due to 4 previous errors diff --git a/src/test/ui/check-doc-alias-attr-location.rs b/src/test/ui/check-doc-alias-attr-location.rs index 9f0b1dcf44af2..dac9b7372e08b 100644 --- a/src/test/ui/check-doc-alias-attr-location.rs +++ b/src/test/ui/check-doc-alias-attr-location.rs @@ -12,7 +12,7 @@ extern {} #[doc(alias = "bar")] //~ ERROR impl Bar { - #[doc(alias = "const")] //~ ERROR + #[doc(alias = "const")] const A: u32 = 0; } diff --git a/src/test/ui/check-doc-alias-attr-location.stderr b/src/test/ui/check-doc-alias-attr-location.stderr index b4a0847a002ba..29a99e4470e5f 100644 --- a/src/test/ui/check-doc-alias-attr-location.stderr +++ b/src/test/ui/check-doc-alias-attr-location.stderr @@ -16,17 +16,11 @@ error: `#[doc(alias = "...")]` isn't allowed on implementation block LL | #[doc(alias = "foobar")] | ^^^^^^^^^^^^^^^^ -error: `#[doc(alias = "...")]` isn't allowed on const in implementation block - --> $DIR/check-doc-alias-attr-location.rs:15:11 - | -LL | #[doc(alias = "const")] - | ^^^^^^^^^^^^^^^ - error: `#[doc(alias = "...")]` isn't allowed on type alias in implementation block --> $DIR/check-doc-alias-attr-location.rs:21:11 | LL | #[doc(alias = "assoc")] | ^^^^^^^^^^^^^^^ -error: aborting due to 5 previous errors +error: aborting due to 4 previous errors