diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs
index 2455d56bd2b3f..a7f852a432c82 100644
--- a/src/librustdoc/html/render/context.rs
+++ b/src/librustdoc/html/render/context.rs
@@ -250,6 +250,8 @@ impl<'tcx> Context<'tcx> {
fn build_sidebar_items(&self, m: &clean::Module) -> BTreeMap> {
// BTreeMap instead of HashMap to get a sorted output
let mut map: BTreeMap<_, Vec<_>> = BTreeMap::new();
+ let mut inserted: FxHashMap> = FxHashMap::default();
+
for item in &m.items {
if item.is_stripped() {
continue;
@@ -258,13 +260,16 @@ impl<'tcx> Context<'tcx> {
let short = item.type_();
let myname = match item.name {
None => continue,
- Some(ref s) => s.to_string(),
+ Some(s) => s,
};
- let short = short.to_string();
- map.entry(short).or_default().push((
- myname,
- Some(item.doc_value().map_or_else(String::new, |s| plain_text_summary(&s))),
- ));
+ if inserted.entry(short).or_default().insert(myname) {
+ let short = short.to_string();
+ let myname = myname.to_string();
+ map.entry(short).or_default().push((
+ myname,
+ Some(item.doc_value().map_or_else(String::new, |s| plain_text_summary(&s))),
+ ));
+ }
}
if self.shared.sort_modules_alphabetically {
diff --git a/src/test/rustdoc-gui/duplicate-macro-reexport.goml b/src/test/rustdoc-gui/duplicate-macro-reexport.goml
new file mode 100644
index 0000000000000..c79b3a220c42c
--- /dev/null
+++ b/src/test/rustdoc-gui/duplicate-macro-reexport.goml
@@ -0,0 +1,14 @@
+// This test ensures that there is no macro duplicates in the sidebar.
+goto: file://|DOC_PATH|/test_docs/macro.a.html
+// Waiting for the elements in the sidebar to be rendered.
+wait-for: ".sidebar-elems .others .macro"
+// Check there is only one macro named "a" listed in the sidebar.
+assert-count: (
+ "//*[@class='sidebar-elems']//*[@class='others']/*[@class='block macro']//li/a[text()='a']",
+ 1,
+)
+// Check there is only one macro named "b" listed in the sidebar.
+assert-count: (
+ "//*[@class='sidebar-elems']//*[@class='others']/*[@class='block macro']//li/a[text()='b']",
+ 1,
+)
diff --git a/src/test/rustdoc-gui/src/test_docs/lib.rs b/src/test/rustdoc-gui/src/test_docs/lib.rs
index 2068d1d6f39af..348b1a65c786c 100644
--- a/src/test/rustdoc-gui/src/test_docs/lib.rs
+++ b/src/test/rustdoc-gui/src/test_docs/lib.rs
@@ -271,3 +271,6 @@ impl EmptyTrait1 for HasEmptyTraits {}
impl EmptyTrait2 for HasEmptyTraits {}
#[doc(cfg(feature = "some-feature"))]
impl EmptyTrait3 for HasEmptyTraits {}
+
+mod macros;
+pub use macros::*;
diff --git a/src/test/rustdoc-gui/src/test_docs/macros.rs b/src/test/rustdoc-gui/src/test_docs/macros.rs
new file mode 100644
index 0000000000000..07b2b97926d43
--- /dev/null
+++ b/src/test/rustdoc-gui/src/test_docs/macros.rs
@@ -0,0 +1,4 @@
+#[macro_export]
+macro_rules! a{ () => {}}
+#[macro_export]
+macro_rules! b{ () => {}}