diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 972c2f0e15c5eb33ad63776bf453cb35e1b0536f..45a5e5115a39b0ed23d77d2bd248722109d3b667 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -1257,9 +1257,11 @@ fn fold_item(&mut self, item: clean::Item) -> Option { // Collect all the implementors of traits. if let clean::ImplItem(ref i) = item.inner { if let Some(did) = i.trait_.def_id() { - self.implementors.entry(did).or_default().push(Impl { - impl_item: item.clone(), - }); + if i.blanket_impl.is_none() { + self.implementors.entry(did).or_default().push(Impl { + impl_item: item.clone(), + }); + } } } @@ -2931,7 +2933,6 @@ fn trait_item(w: &mut fmt::Formatter, cx: &Context, m: &clean::Item, t: &clean:: let (synthetic, concrete): (Vec<&&Impl>, Vec<&&Impl>) = local.iter() - .filter(|i| i.inner_impl().blanket_impl.is_none()) .partition(|i| i.inner_impl().synthetic); if !foreign.is_empty() { @@ -2941,17 +2942,14 @@ fn trait_item(w: &mut fmt::Formatter, cx: &Context, m: &clean::Item, t: &clean:: ")?; - let mut foreign_cache = FxHashSet(); for implementor in foreign { - if foreign_cache.insert(implementor.inner_impl().to_string()) { - let assoc_link = AssocItemLink::GotoSource( - implementor.impl_item.def_id, - &implementor.inner_impl().provided_trait_methods - ); - render_impl(w, cx, &implementor, assoc_link, - RenderMode::Normal, implementor.impl_item.stable_since(), false, - None)?; - } + let assoc_link = AssocItemLink::GotoSource( + implementor.impl_item.def_id, + &implementor.inner_impl().provided_trait_methods + ); + render_impl(w, cx, &implementor, assoc_link, + RenderMode::Normal, implementor.impl_item.stable_since(), false, + None)?; } } diff --git a/src/test/rustdoc/auxiliary/issue-53689.rs b/src/test/rustdoc/auxiliary/issue-53689.rs new file mode 100644 index 0000000000000000000000000000000000000000..7b7f9013ca3341a29ba95ff71a2f2ad264e90ebb --- /dev/null +++ b/src/test/rustdoc/auxiliary/issue-53689.rs @@ -0,0 +1,11 @@ +// Copyright 2018 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. + +pub struct MyStruct; diff --git a/src/test/rustdoc/issue-53689.rs b/src/test/rustdoc/issue-53689.rs new file mode 100644 index 0000000000000000000000000000000000000000..bfe5adf8888e6c44f6e2e54112e61c767dcb4f16 --- /dev/null +++ b/src/test/rustdoc/issue-53689.rs @@ -0,0 +1,26 @@ +// Copyright 2018 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. + +// aux-build:issue-53689.rs + +#![crate_name = "foo"] + +extern crate issue_53689; + +// @has foo/trait.MyTrait.html +// @!has - 'MyStruct' +// @count - '//*[code="impl MyTrait for T"]' 1 +pub trait MyTrait {} + +impl MyTrait for T {} + +mod a { + pub use issue_53689::MyStruct; +}