diff --git a/src/librustdoc/html/render/sidebar.rs b/src/librustdoc/html/render/sidebar.rs
index 50c09b98db441..64dbaf9083e70 100644
--- a/src/librustdoc/html/render/sidebar.rs
+++ b/src/librustdoc/html/render/sidebar.rs
@@ -1,4 +1,5 @@
use std::borrow::Cow;
+use std::cmp::Ordering;
use rinja::Template;
use rustc_data_structures::fx::FxHashSet;
@@ -12,6 +13,7 @@ use crate::clean;
use crate::formats::Impl;
use crate::formats::item_type::ItemType;
use crate::html::markdown::{IdMap, MarkdownWithToc};
+use crate::html::render::print_item::compare_names;
#[derive(Clone, Copy)]
pub(crate) enum ModuleLike {
@@ -77,7 +79,7 @@ impl<'a> LinkBlock<'a> {
}
/// A link to an item. Content should not be escaped.
-#[derive(PartialOrd, Ord, PartialEq, Eq, Hash, Clone)]
+#[derive(Ord, PartialEq, Eq, Hash, Clone)]
pub(crate) struct Link<'a> {
/// The content for the anchor tag and title attr
name: Cow<'a, str>,
@@ -89,6 +91,20 @@ pub(crate) struct Link<'a> {
children: Vec>,
}
+impl PartialOrd for Link<'_> {
+ fn partial_cmp(&self, other: &Link<'_>) -> Option {
+ match compare_names(&self.name, &other.name) {
+ Ordering::Equal => (),
+ result => return Some(result),
+ }
+ (&self.name_html, &self.href, &self.children).partial_cmp(&(
+ &other.name_html,
+ &other.href,
+ &other.children,
+ ))
+ }
+}
+
impl<'a> Link<'a> {
pub fn new(href: impl Into>, name: impl Into>) -> Self {
Self { href: href.into(), name: name.into(), children: vec![], name_html: None }
diff --git a/tests/rustdoc-gui/sidebar-foreign-impl-sort.goml b/tests/rustdoc-gui/sidebar-foreign-impl-sort.goml
new file mode 100644
index 0000000000000..f09f09713514d
--- /dev/null
+++ b/tests/rustdoc-gui/sidebar-foreign-impl-sort.goml
@@ -0,0 +1,15 @@
+// Checks sidebar resizing close the Settings popover
+go-to: "file://" + |DOC_PATH| + "/test_docs/SidebarSort/trait.Sort.html#foreign-impls"
+
+// Check that the sidebar contains the expected foreign implementations
+assert-text: (".sidebar-elems section ul > li:nth-child(1)", "&'a str")
+assert-text: (".sidebar-elems section ul > li:nth-child(2)", "AtomicBool")
+assert-text: (".sidebar-elems section ul > li:nth-child(3)", "AtomicU8")
+assert-text: (".sidebar-elems section ul > li:nth-child(4)", "AtomicU16")
+assert-text: (".sidebar-elems section ul > li:nth-child(5)", "AtomicU32")
+assert-text: (".sidebar-elems section ul > li:nth-child(6)", "Cell")
+assert-text: (".sidebar-elems section ul > li:nth-child(7)", "Cell")
+assert-text: (".sidebar-elems section ul > li:nth-child(8)", "u8")
+assert-text: (".sidebar-elems section ul > li:nth-child(9)", "u16")
+assert-text: (".sidebar-elems section ul > li:nth-child(10)", "u32")
+assert-text: (".sidebar-elems section ul > li:nth-child(11)", "usize")
diff --git a/tests/rustdoc-gui/src/test_docs/lib.rs b/tests/rustdoc-gui/src/test_docs/lib.rs
index 1a9ffbe889851..f9c20ab22b89d 100644
--- a/tests/rustdoc-gui/src/test_docs/lib.rs
+++ b/tests/rustdoc-gui/src/test_docs/lib.rs
@@ -713,3 +713,21 @@ pub trait ItemsTrait {
/// blablala
fn bar();
}
+
+pub mod SidebarSort {
+ use std::cell::Cell;
+ use std::sync::atomic::*;
+ pub trait Sort {}
+
+ impl Sort for u32 {}
+ impl Sort for u8 {}
+ impl Sort for u16 {}
+ impl Sort for usize {}
+ impl Sort for AtomicU32 {}
+ impl Sort for AtomicU16 {}
+ impl Sort for AtomicU8 {}
+ impl Sort for AtomicBool {}
+ impl Sort for Cell {}
+ impl Sort for Cell {}
+ impl<'a> Sort for &'a str {}
+}