From 9876a11f938db08d59168a366579567b68a693ea Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 19 Apr 2023 11:32:36 +0200 Subject: [PATCH 1/2] Fix missing blanket impl if the trait is not directly public --- src/librustdoc/clean/blanket_impl.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/librustdoc/clean/blanket_impl.rs b/src/librustdoc/clean/blanket_impl.rs index 3a3bf6a7ab9e8..e4c05b5737835 100644 --- a/src/librustdoc/clean/blanket_impl.rs +++ b/src/librustdoc/clean/blanket_impl.rs @@ -20,7 +20,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> { trace!("get_blanket_impls({:?})", ty); let mut impls = Vec::new(); for trait_def_id in cx.tcx.all_traits() { - if !cx.cache.effective_visibilities.is_directly_public(cx.tcx, trait_def_id) + if !cx.cache.effective_visibilities.is_reachable(cx.tcx, trait_def_id) || cx.generated_synthetics.get(&(ty.0, trait_def_id)).is_some() { continue; From 96f4f4e02eaf9ff43b8749dc165258468799c86c Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 19 Apr 2023 11:32:50 +0200 Subject: [PATCH 2/2] Add regression test for #94183 --- ...sue-94183-blanket-impl-reexported-trait.rs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 tests/rustdoc/issue-94183-blanket-impl-reexported-trait.rs diff --git a/tests/rustdoc/issue-94183-blanket-impl-reexported-trait.rs b/tests/rustdoc/issue-94183-blanket-impl-reexported-trait.rs new file mode 100644 index 0000000000000..95ddd4c74715a --- /dev/null +++ b/tests/rustdoc/issue-94183-blanket-impl-reexported-trait.rs @@ -0,0 +1,31 @@ +// Regression test for . +// This test ensures that a publicly re-exported private trait will +// appear in the blanket impl list. + +#![crate_name = "foo"] + +// @has 'foo/struct.S.html' + +mod actual_sub { + pub trait Actual {} + pub trait Another {} + + // `Another` is publicly re-exported so it should appear in the blanket impl list. + // @has - '//*[@id="blanket-implementations-list"]//*[@class="code-header"]' 'impl Another for T' + impl Another for T {} + + trait Foo {} + + // `Foo` is not publicly re-exported nor reachable so it shouldn't appear in the + // blanket impl list. + // @!has - '//*[@id="blanket-implementations-list"]//*[@class="code-header"]' 'impl Foo for T' + impl Foo for T {} +} + +pub use actual_sub::{Actual, Another}; + +// `Actual` is publicly re-exported so it should appear in the blanket impl list. +// @has - '//*[@id="blanket-implementations-list"]//*[@class="code-header"]' 'impl Actual for T' +impl Actual for T {} + +pub struct S;