about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2023-07-01 13:46:02 +0200
committerGitHub <noreply@github.com>2023-07-01 13:46:02 +0200
commitbcd804ba52b6071f938f6895a848b516ee402976 (patch)
tree829d6a5790d2e1d5067160fdbde2f3bec0b3797d
parentca7e27a71c9d618688d05f22a78b7cc31cf4437f (diff)
parentf9a4db731288a64eb9e3aef037128c825157c0b0 (diff)
downloadrust-bcd804ba52b6071f938f6895a848b516ee402976.tar.gz
rust-bcd804ba52b6071f938f6895a848b516ee402976.zip
Rollup merge of #113196 - Bryanskiy:assoc_item, r=petrochenkov
Fix associated items effective visibility calculation for type privacy lints

Fixes https://github.com/rust-lang/rust/pull/113126#discussion_r1246555520.
-rw-r--r--compiler/rustc_privacy/src/lib.rs11
1 files changed, 7 insertions, 4 deletions
diff --git a/compiler/rustc_privacy/src/lib.rs b/compiler/rustc_privacy/src/lib.rs
index c3e8d45d201..055006373ef 100644
--- a/compiler/rustc_privacy/src/lib.rs
+++ b/compiler/rustc_privacy/src/lib.rs
@@ -2135,16 +2135,18 @@ impl<'tcx> PrivateItemsInPublicInterfacesChecker<'tcx, '_> {
                     // lints shouldn't be emmited even if `from` effective visibility
                     // is larger than `Priv` nominal visibility and if `Priv` can leak
                     // in some scenarios due to type inference.
-                    let impl_ev = Some(EffectiveVisibility::of_impl::<false>(
+                    let impl_ev = EffectiveVisibility::of_impl::<false>(
                         item.owner_id.def_id,
                         tcx,
                         self.effective_visibilities,
-                    ));
+                    );
 
                     // check that private components do not appear in the generics or predicates of inherent impls
                     // this check is intentionally NOT performed for impls of traits, per #90586
                     if impl_.of_trait.is_none() {
-                        self.check(item.owner_id.def_id, impl_vis, impl_ev).generics().predicates();
+                        self.check(item.owner_id.def_id, impl_vis, Some(impl_ev))
+                            .generics()
+                            .predicates();
                     }
                     for impl_item_ref in impl_.items {
                         let impl_item_vis = if impl_.of_trait.is_none() {
@@ -2159,8 +2161,9 @@ impl<'tcx> PrivateItemsInPublicInterfacesChecker<'tcx, '_> {
 
                         let impl_item_ev = if impl_.of_trait.is_none() {
                             self.get(impl_item_ref.id.owner_id.def_id)
+                                .map(|ev| ev.min(impl_ev, self.tcx))
                         } else {
-                            impl_ev
+                            Some(impl_ev)
                         };
 
                         self.check_assoc_item(