Rollup merge of #110533 - GuillaumeGomez:missing-blanket-impl-trait-not-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`
This commit is contained in:
Matthias Krüger 2023-04-19 17:54:43 +02:00 committed by GitHub
commit 770f6cd254
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 1 deletions

View file

@ -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;

View file

@ -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;