diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs
index e79a63fb8d8..c1402e00272 100644
--- a/src/librustdoc/html/render.rs
+++ b/src/librustdoc/html/render.rs
@@ -3613,18 +3613,24 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
}
let mut links = HashSet::new();
let ret = v.iter()
- .filter_map(|i| if let Some(ref i) = i.inner_impl().trait_ {
- let i_display = format!("{:#}", i);
- let out = Escape(&i_display);
- let encoded = small_url_encode(&format!("{:#}", i));
- let generated = format!("{}", encoded, out);
- if !links.contains(&generated) && links.insert(generated.clone()) {
- Some(generated)
+ .filter_map(|i| {
+ let is_negative_impl = is_negative_impl(i.inner_impl());
+ if let Some(ref i) = i.inner_impl().trait_ {
+ let i_display = format!("{:#}", i);
+ let out = Escape(&i_display);
+ let encoded = small_url_encode(&format!("{:#}", i));
+ let generated = format!("{}{}",
+ encoded,
+ if is_negative_impl { "!" } else { "" },
+ out);
+ if !links.contains(&generated) && links.insert(generated.clone()) {
+ Some(generated)
+ } else {
+ None
+ }
} else {
None
}
- } else {
- None
})
.collect::();
if !ret.is_empty() {
@@ -3671,6 +3677,10 @@ fn extract_for_impl_name(item: &clean::Item) -> Option<(String, String)> {
}
}
+fn is_negative_impl(i: &clean::Impl) -> bool {
+ i.polarity == Some(clean::ImplPolarity::Negative)
+}
+
fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
t: &clean::Trait) -> fmt::Result {
let mut sidebar = String::new();
diff --git a/src/test/rustdoc/negative-impl-sidebar.rs b/src/test/rustdoc/negative-impl-sidebar.rs
new file mode 100644
index 00000000000..dc27b26241d
--- /dev/null
+++ b/src/test/rustdoc/negative-impl-sidebar.rs
@@ -0,0 +1,19 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 or the MIT license
+// , at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(optin_builtin_traits)]
+#![crate_name = "foo"]
+
+pub struct Foo;
+
+// @has foo/struct.Foo.html
+// @has - '//*[@class="sidebar-title"][@href="#implementations"]' 'Trait Implementations'
+// @has - '//*[@class="sidebar-links"]/a' '!Sync'
+impl !Sync for Foo {}