Skip to content

Commit

Permalink
Rollup merge of #110533 - GuillaumeGomez:missing-blanket-impl-trait-n…
Browse files Browse the repository at this point in the history
…ot-public, r=notriddle

Missing blanket impl trait not public

Fixes #94183.

The problem was that we should have checked if the trait was reachable instead of only "directly public".

r? `@notriddle`
  • Loading branch information
matthiaskrgr authored Apr 19, 2023
2 parents 75de33c + 96f4f4e commit 770f6cd
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/librustdoc/clean/blanket_impl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
31 changes: 31 additions & 0 deletions tests/rustdoc/issue-94183-blanket-impl-reexported-trait.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// Regression test for <https://github.com/rust-lang/rust/issues/94183>.
// 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<T> Another for T'
impl<T> 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<T> Foo for T'
impl<T> 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<T> Actual for T'
impl<T> Actual for T {}

pub struct S;

0 comments on commit 770f6cd

Please sign in to comment.