diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index 50153ac14a204..e06168c708c18 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -578,14 +578,23 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
info!("Documenting {} on {:?}", name, t.name);
let item_type = m.type_();
let id = cx.derive_id(format!("{}.{}", item_type, name));
- write!(w, "");
- write!(w, "", id = id,);
+ let mut content = Buffer::empty_from(w);
+ document(&mut content, cx, m, Some(t));
+ let toggled = !content.is_empty();
+ if toggled {
+ write!(w, "");
+ }
+ write!(w, "", id = id);
render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl, cx);
w.write_str("
");
render_stability_since(w, m, t, cx.tcx());
write_srclink(cx, m, w);
- w.write_str("
");
- document(w, cx, m, Some(t));
+ w.write_str("
");
+ if toggled {
+ write!(w, "
");
+ w.push_buffer(content);
+ write!(w, " ");
+ }
}
if !types.is_empty() {
diff --git a/src/test/rustdoc/toggle-trait-fn.rs b/src/test/rustdoc/toggle-trait-fn.rs
index a160809cbf957..7fcac78556b72 100644
--- a/src/test/rustdoc/toggle-trait-fn.rs
+++ b/src/test/rustdoc/toggle-trait-fn.rs
@@ -1,7 +1,11 @@
#![crate_name = "foo"]
// @has foo/trait.Foo.html
-// @has - '//details[@class="rustdoc-toggle"]//code' 'bar'
+// @!has - '//details[@class="rustdoc-toggle"]//code' 'bar'
+// @has - '//code' 'bar'
+// @has - '//details[@class="rustdoc-toggle"]//code' 'foo'
pub trait Foo {
fn bar() -> ();
+ /// hello
+ fn foo();
}