diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index bdcfa782bb7..8aad4d301ee 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -3525,6 +3525,21 @@ fn get_methods(i: &clean::Impl) -> Vec {
}).collect::>()
}
+// The point is to url encode any potential character from a type with genericity.
+fn small_url_encode(s: &str) -> String {
+ s.replace("<", "%3C")
+ .replace(">", "%3E")
+ .replace(" ", "%20")
+ .replace("?", "%3F")
+ .replace("'", "%27")
+ .replace("&", "%26")
+ .replace(",", "%2C")
+ .replace(":", "%3A")
+ .replace(";", "%3B")
+ .replace("[", "%5B")
+ .replace("]", "%5D")
+}
+
fn sidebar_assoc_items(it: &clean::Item) -> String {
let mut out = String::new();
let c = cache();
@@ -3568,7 +3583,8 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
let ret = v.iter()
.filter_map(|i| if let Some(ref i) = i.inner_impl().trait_ {
let out = format!("{:#}", i).replace("<", "<").replace(">", ">");
- Some(format!("{}", i, out))
+ let encoded = small_url_encode(&format!("{:#}", i));
+ Some(format!("{}", encoded, out))
} else {
None
})