about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDennis Hamester <dennis.hamester@gmail.com>2020-07-08 07:39:49 +0200
committerDennis Hamester <dennis.hamester@gmail.com>2020-07-08 08:15:34 +0200
commitc8b16cdbd0f06c66467c082b9d3e190255fa295d (patch)
tree9b11180af24feffbded13c968828fa436b259de9
parent8ac1525e091d3db28e67adcbbd6db1e1deaa37fb (diff)
downloadrust-c8b16cdbd0f06c66467c082b9d3e190255fa295d.tar.gz
rust-c8b16cdbd0f06c66467c082b9d3e190255fa295d.zip
rustdoc: Allow linking from private items to private types
Fixes #74134

After PR #72771 this would trigger an intra_doc_link_resolution_failure warning
when rustdoc is invoked without --document-private-items. Links from private
items to private types are however never actually generated in that case and
thus shouldn't produce a warning. These links are in fact a very useful tool to
document crate internals.

Tests are added for all 4 combinations of public/private items and link
targets. Test 1 is the case mentioned above and fails without this commit. Tests
2 - 4 passed before already but are added nonetheless to prevent regressions.
-rw-r--r--src/librustdoc/passes/collect_intra_doc_links.rs1
-rw-r--r--src/test/rustdoc/issue-74134-1.rs10
-rw-r--r--src/test/rustdoc/issue-74134-2.rs11
-rw-r--r--src/test/rustdoc/issue-74134-3.rs11
-rw-r--r--src/test/rustdoc/issue-74134-4.rs11
5 files changed, 44 insertions, 0 deletions
diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs
index f1d1bf439f1..86f94af0c6e 100644
--- a/src/librustdoc/passes/collect_intra_doc_links.rs
+++ b/src/librustdoc/passes/collect_intra_doc_links.rs
@@ -796,6 +796,7 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> {
 
                     let hir_id = self.cx.tcx.hir().as_local_hir_id(local);
                     if !self.cx.tcx.privacy_access_levels(LOCAL_CRATE).is_exported(hir_id)
+                        && (item.visibility == Visibility::Public)
                         && !self.cx.render_options.document_private
                     {
                         let item_name = item.name.as_deref().unwrap_or("<unknown>");
diff --git a/src/test/rustdoc/issue-74134-1.rs b/src/test/rustdoc/issue-74134-1.rs
new file mode 100644
index 00000000000..72d38638a79
--- /dev/null
+++ b/src/test/rustdoc/issue-74134-1.rs
@@ -0,0 +1,10 @@
+#![deny(intra_doc_link_resolution_failure)]
+
+// Linking from a private item to a private type is fine without --document-private-items.
+
+struct Private;
+
+pub struct Public {
+    /// [`Private`]
+    private: Private,
+}
diff --git a/src/test/rustdoc/issue-74134-2.rs b/src/test/rustdoc/issue-74134-2.rs
new file mode 100644
index 00000000000..f665e360b49
--- /dev/null
+++ b/src/test/rustdoc/issue-74134-2.rs
@@ -0,0 +1,11 @@
+// compile-flags: --document-private-items
+#![deny(intra_doc_link_resolution_failure)]
+
+// Linking from a private item to a private type is fine with --document-private-items.
+
+struct Private;
+
+pub struct Public {
+    /// [`Private`]
+    private: Private,
+}
diff --git a/src/test/rustdoc/issue-74134-3.rs b/src/test/rustdoc/issue-74134-3.rs
new file mode 100644
index 00000000000..b2709ecdadd
--- /dev/null
+++ b/src/test/rustdoc/issue-74134-3.rs
@@ -0,0 +1,11 @@
+// should-fail
+#![deny(intra_doc_link_resolution_failure)]
+
+// Linking from a public item to a private type fails without --document-private-items.
+
+struct Private;
+
+pub struct Public {
+    /// [`Private`]
+    pub public: u32,
+}
diff --git a/src/test/rustdoc/issue-74134-4.rs b/src/test/rustdoc/issue-74134-4.rs
new file mode 100644
index 00000000000..efff74f2797
--- /dev/null
+++ b/src/test/rustdoc/issue-74134-4.rs
@@ -0,0 +1,11 @@
+// compile-flags: --document-private-items
+#![deny(intra_doc_link_resolution_failure)]
+
+// Linking from a public item to a private type is fine with --document-private-items.
+
+struct Private;
+
+pub struct Public {
+    /// [`Private`]
+    pub public: u32,
+}