diff --git a/src/librustdoc/html/render/search_index.rs b/src/librustdoc/html/render/search_index.rs
index e22ac6ec19b00..84213182d0ac1 100644
--- a/src/librustdoc/html/render/search_index.rs
+++ b/src/librustdoc/html/render/search_index.rs
@@ -465,7 +465,7 @@ fn add_generics_and_bounds_as_types<'tcx, 'a>(
}
// First, check if it's "Self".
- let arg = if let Some(self_) = self_ {
+ let mut arg = if let Some(self_) = self_ {
match &*arg {
Type::BorrowedRef { type_, .. } if type_.is_self_type() => self_,
type_ if type_.is_self_type() => self_,
@@ -475,11 +475,16 @@ fn add_generics_and_bounds_as_types<'tcx, 'a>(
arg
};
+ // strip references from the argument type
+ while let Type::BorrowedRef { type_, .. } = &*arg {
+ arg = &*type_;
+ }
+
// If this argument is a type parameter and not a trait bound or a type, we need to look
// for its bounds.
if let Type::Generic(arg_s) = *arg {
// First we check if the bounds are in a `where` predicate...
- if let Some(where_pred) = generics.where_predicates.iter().find(|g| match g {
+ for where_pred in generics.where_predicates.iter().filter(|g| match g {
WherePredicate::BoundPredicate { ty: Type::Generic(ty_s), .. } => *ty_s == arg_s,
_ => false,
}) {
diff --git a/tests/rustdoc-js-std/option-type-signatures.js b/tests/rustdoc-js-std/option-type-signatures.js
index dee4819e81a9f..6bf421a213560 100644
--- a/tests/rustdoc-js-std/option-type-signatures.js
+++ b/tests/rustdoc-js-std/option-type-signatures.js
@@ -1,7 +1,18 @@
-const QUERY = 'option, fnonce -> option';
+const QUERY = [
+ 'option, fnonce -> option',
+ 'option -> default',
+];
-const EXPECTED = {
- 'others': [
- { 'path': 'std::option::Option', 'name': 'map' },
- ],
-};
+const EXPECTED = [
+ {
+ 'others': [
+ { 'path': 'std::option::Option', 'name': 'map' },
+ ],
+ },
+ {
+ 'others': [
+ { 'path': 'std::option::Option', 'name': 'unwrap_or_default' },
+ { 'path': 'std::option::Option', 'name': 'get_or_insert_default' },
+ ],
+ },
+];
diff --git a/tests/rustdoc-js/where-clause.js b/tests/rustdoc-js/where-clause.js
index 6cb42a455a369..86254a80e20f3 100644
--- a/tests/rustdoc-js/where-clause.js
+++ b/tests/rustdoc-js/where-clause.js
@@ -1,4 +1,4 @@
-const QUERY = ['trait', '-> trait', 't1, t2'];
+const QUERY = ['trait', '-> trait', 't1, t2', '-> shazam', 'drizzel -> shazam'];
const EXPECTED = [
{
@@ -16,4 +16,15 @@ const EXPECTED = [
{ 'path': 'where_clause', 'name': 'presto' },
],
},
+ {
+ 'others': [
+ { 'path': 'where_clause', 'name': 'bippety' },
+ { 'path': 'where_clause::Drizzel', 'name': 'boppety' },
+ ],
+ },
+ {
+ 'others': [
+ { 'path': 'where_clause::Drizzel', 'name': 'boppety' },
+ ],
+ },
];
diff --git a/tests/rustdoc-js/where-clause.rs b/tests/rustdoc-js/where-clause.rs
index 808561feee227..56c01019fb69f 100644
--- a/tests/rustdoc-js/where-clause.rs
+++ b/tests/rustdoc-js/where-clause.rs
@@ -14,3 +14,17 @@ pub trait T2<'a, T> {
}
pub fn presto(_: A, _: B) where A: T1, B: for <'b> T2<'b, Nested> {}
+
+pub trait Shazam {}
+
+pub fn bippety() -> &'static X where X: Shazam {
+ panic!()
+}
+
+pub struct Drizzel(T);
+
+impl Drizzel {
+ pub fn boppety(&self) -> &T where T: Shazam {
+ panic!();
+ }
+}