diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index 532a0cf9329..a54b4adc132 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -1151,11 +1151,12 @@ impl LinkCollector<'_, '_> { }; let verify = |kind: DefKind, id: DefId| { - debug!("intra-doc link to {} resolved to {:?}", path_str, res); + let (kind, id) = self.kind_side_channel.take().unwrap_or((kind, id)); + debug!("intra-doc link to {} resolved to {:?} (id: {:?})", path_str, res, id); // Disallow e.g. linking to enums with `struct@` debug!("saw kind {:?} with disambiguator {:?}", kind, disambiguator); - match (self.kind_side_channel.take().map(|(kind, _)| kind).unwrap_or(kind), disambiguator) { + match (kind, disambiguator) { | (DefKind::Const | DefKind::ConstParam | DefKind::AssocConst | DefKind::AnonConst, Some(Disambiguator::Kind(DefKind::Const))) // NOTE: this allows 'method' to mean both normal functions and associated functions // This can't cause ambiguity because both are in the same namespace. @@ -1190,7 +1191,7 @@ impl LinkCollector<'_, '_> { } } - Some((kind, id)) + Some(()) }; match res { @@ -1241,7 +1242,7 @@ impl LinkCollector<'_, '_> { Some(ItemLink { link: ori_link.link, link_text, did: None, fragment }) } Res::Def(kind, id) => { - let (kind, id) = verify(kind, id)?; + verify(kind, id)?; let id = clean::register_res(cx, rustc_hir::def::Res::Def(kind, id)); Some(ItemLink { link: ori_link.link, link_text, did: Some(id), fragment }) } diff --git a/src/test/rustdoc-ui/intra-doc/private.private.stderr b/src/test/rustdoc-ui/intra-doc/private.private.stderr index 6e11ec3e87b..94a833fcc1a 100644 --- a/src/test/rustdoc-ui/intra-doc/private.private.stderr +++ b/src/test/rustdoc-ui/intra-doc/private.private.stderr @@ -1,11 +1,19 @@ warning: public documentation for `DocMe` links to private item `DontDocMe` --> $DIR/private.rs:5:11 | -LL | /// docs [DontDocMe] +LL | /// docs [DontDocMe] [DontDocMe::f] | ^^^^^^^^^ this item is private | = note: `#[warn(private_intra_doc_links)]` on by default = note: this link resolves only because you passed `--document-private-items`, but will break without -warning: 1 warning emitted +warning: public documentation for `DocMe` links to private item `DontDocMe::f` + --> $DIR/private.rs:5:23 + | +LL | /// docs [DontDocMe] [DontDocMe::f] + | ^^^^^^^^^^^^ this item is private + | + = note: this link resolves only because you passed `--document-private-items`, but will break without + +warning: 2 warnings emitted diff --git a/src/test/rustdoc-ui/intra-doc/private.public.stderr b/src/test/rustdoc-ui/intra-doc/private.public.stderr index 3a6a4b66452..21a60638d5e 100644 --- a/src/test/rustdoc-ui/intra-doc/private.public.stderr +++ b/src/test/rustdoc-ui/intra-doc/private.public.stderr @@ -1,11 +1,19 @@ warning: public documentation for `DocMe` links to private item `DontDocMe` --> $DIR/private.rs:5:11 | -LL | /// docs [DontDocMe] +LL | /// docs [DontDocMe] [DontDocMe::f] | ^^^^^^^^^ this item is private | = note: `#[warn(private_intra_doc_links)]` on by default = note: this link will resolve properly if you pass `--document-private-items` -warning: 1 warning emitted +warning: public documentation for `DocMe` links to private item `DontDocMe::f` + --> $DIR/private.rs:5:23 + | +LL | /// docs [DontDocMe] [DontDocMe::f] + | ^^^^^^^^^^^^ this item is private + | + = note: this link will resolve properly if you pass `--document-private-items` + +warning: 2 warnings emitted diff --git a/src/test/rustdoc-ui/intra-doc/private.rs b/src/test/rustdoc-ui/intra-doc/private.rs index 613236d75d2..3782864305f 100644 --- a/src/test/rustdoc-ui/intra-doc/private.rs +++ b/src/test/rustdoc-ui/intra-doc/private.rs @@ -2,8 +2,13 @@ // revisions: public private // [private]compile-flags: --document-private-items -/// docs [DontDocMe] +/// docs [DontDocMe] [DontDocMe::f] //~^ WARNING public documentation for `DocMe` links to private item `DontDocMe` +//~| WARNING public documentation for `DocMe` links to private item `DontDocMe::f` // FIXME: for [private] we should also make sure the link was actually generated pub struct DocMe; struct DontDocMe; + +impl DontDocMe { + fn f() {} +}