about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMichael Howell <michael@notriddle.com>2022-07-25 16:35:12 -0700
committerMichael Howell <michael@notriddle.com>2022-07-25 16:35:12 -0700
commit225ac9efc10bfd4149fd6de3d09e70d6c2387a8b (patch)
tree034895846a2b8e62690e2e4a17097aa10103b0ce
parentbdf520fd419cd4dea184332f57206f1cf5ca3e8f (diff)
downloadrust-225ac9efc10bfd4149fd6de3d09e70d6c2387a8b.tar.gz
rust-225ac9efc10bfd4149fd6de3d09e70d6c2387a8b.zip
rustdoc: avoid inlining modules with duplicate names
Fixes rust-lang/rust#99734
-rw-r--r--src/librustdoc/clean/mod.rs7
-rw-r--r--src/test/rustdoc/auxiliary/issue-99734-aux.rs7
-rw-r--r--src/test/rustdoc/issue-99734-multiple-mods-w-same-name.rs14
3 files changed, 26 insertions, 2 deletions
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index c9ef4748a48..cf03979a934 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -51,19 +51,22 @@ pub(crate) trait Clean<'tcx, T> {
 impl<'tcx> Clean<'tcx, Item> for DocModule<'tcx> {
     fn clean(&self, cx: &mut DocContext<'tcx>) -> Item {
         let mut items: Vec<Item> = vec![];
+        let mut inserted = FxHashSet::default();
         items.extend(
             self.foreigns
                 .iter()
                 .map(|(item, renamed)| clean_maybe_renamed_foreign_item(cx, item, *renamed)),
         );
-        items.extend(self.mods.iter().map(|x| x.clean(cx)));
+        items.extend(self.mods.iter().map(|x| {
+            inserted.insert((ItemType::Module, x.name));
+            x.clean(cx)
+        }));
 
         // Split up imports from all other items.
         //
         // This covers the case where somebody does an import which should pull in an item,
         // but there's already an item with the same namespace and same name. Rust gives
         // priority to the not-imported one, so we should, too.
-        let mut inserted = FxHashSet::default();
         items.extend(self.items.iter().flat_map(|(item, renamed)| {
             // First, lower everything other than imports.
             if matches!(item.kind, hir::ItemKind::Use(..)) {
diff --git a/src/test/rustdoc/auxiliary/issue-99734-aux.rs b/src/test/rustdoc/auxiliary/issue-99734-aux.rs
new file mode 100644
index 00000000000..8f1f1ec8967
--- /dev/null
+++ b/src/test/rustdoc/auxiliary/issue-99734-aux.rs
@@ -0,0 +1,7 @@
+pub struct Option;
+impl Option {
+    pub fn unwrap(self) {}
+}
+
+/// [`Option::unwrap`]
+pub mod task {}
diff --git a/src/test/rustdoc/issue-99734-multiple-mods-w-same-name.rs b/src/test/rustdoc/issue-99734-multiple-mods-w-same-name.rs
new file mode 100644
index 00000000000..b2f9b8b4657
--- /dev/null
+++ b/src/test/rustdoc/issue-99734-multiple-mods-w-same-name.rs
@@ -0,0 +1,14 @@
+// aux-build:issue-99734-aux.rs
+// build-aux-docs
+// ignore-cross-compile
+
+#![crate_name = "foo"]
+
+#[macro_use]
+extern crate issue_99734_aux;
+
+pub use issue_99734_aux::*;
+
+// @count foo/index.html '//a[@class="mod"][@title="foo::task mod"]' 1
+
+pub mod task {}