about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2022-09-09 12:58:42 -0700
committerMichael Howell <michael@notriddle.com>2022-09-09 13:05:08 -0700
commit1f8d552d6dfd4bb534c98b79150f21a122ed0b4c (patch)
tree643a84b250004f98a69dfda9155fe9505ae0fe49
parent98f3001eecbe4cbd091c10ffab45b4c164bb507b (diff)
downloadrust-1f8d552d6dfd4bb534c98b79150f21a122ed0b4c.tar.gz
rust-1f8d552d6dfd4bb534c98b79150f21a122ed0b4c.zip
rustdoc: avoid cleaning modules with duplicate names
-rw-r--r--src/librustdoc/clean/mod.rs8
-rw-r--r--src/test/rustdoc/issue-83375-multiple-mods-w-same-name-doc-inline.rs15
2 files changed, 20 insertions, 3 deletions
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index 08b696e65eb..ecbfc636314 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -55,9 +55,11 @@ pub(crate) fn clean_doc_module<'tcx>(doc: &DocModule<'tcx>, cx: &mut DocContext<
         }
         item
     }));
-    items.extend(doc.mods.iter().map(|x| {
-        inserted.insert((ItemType::Module, x.name));
-        clean_doc_module(x, cx)
+    items.extend(doc.mods.iter().filter_map(|x| {
+        if !inserted.insert((ItemType::Module, x.name)) {
+            return None;
+        }
+        Some(clean_doc_module(x, cx))
     }));
 
     // Split up imports from all other items.
diff --git a/src/test/rustdoc/issue-83375-multiple-mods-w-same-name-doc-inline.rs b/src/test/rustdoc/issue-83375-multiple-mods-w-same-name-doc-inline.rs
new file mode 100644
index 00000000000..f9a2c0954a7
--- /dev/null
+++ b/src/test/rustdoc/issue-83375-multiple-mods-w-same-name-doc-inline.rs
@@ -0,0 +1,15 @@
+#![crate_name = "foo"]
+
+pub mod sub {
+    pub struct Item;
+
+    pub mod prelude {
+        pub use super::Item;
+    }
+}
+
+// @count foo/index.html '//a[@class="mod"][@title="foo::prelude mod"]' 1
+pub mod prelude {}
+
+#[doc(inline)]
+pub use sub::*;