mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
Auto merge of #144479 - cjgillot:incr-privacy-mod, r=petrochenkov
Perform check_private_in_public by module. Based on https://github.com/rust-lang/rust/pull/116316
This commit is contained in:
@@ -1151,7 +1151,9 @@ fn analysis(tcx: TyCtxt<'_>, (): ()) {
|
||||
|
||||
parallel!(
|
||||
{
|
||||
tcx.ensure_ok().check_private_in_public(());
|
||||
tcx.par_hir_for_each_module(|module| {
|
||||
tcx.ensure_ok().check_private_in_public(module)
|
||||
})
|
||||
},
|
||||
{
|
||||
tcx.par_hir_for_each_module(|module| {
|
||||
|
||||
@@ -1390,8 +1390,11 @@
|
||||
eval_always
|
||||
desc { "checking effective visibilities" }
|
||||
}
|
||||
query check_private_in_public(_: ()) {
|
||||
desc { "checking for private elements in public interfaces" }
|
||||
query check_private_in_public(module_def_id: LocalModDefId) {
|
||||
desc { |tcx|
|
||||
"checking for private elements in public interfaces for {}",
|
||||
describe_as_module(module_def_id, tcx)
|
||||
}
|
||||
}
|
||||
|
||||
query reachable_set(_: ()) -> &'tcx LocalDefIdSet {
|
||||
|
||||
@@ -1423,8 +1423,6 @@ fn check_def_id(&mut self, def_id: DefId, kind: &str, descr: &dyn fmt::Display)
|
||||
};
|
||||
|
||||
let vis = self.tcx.local_visibility(local_def_id);
|
||||
let span = self.tcx.def_span(self.item_def_id.to_def_id());
|
||||
let vis_span = self.tcx.def_span(def_id);
|
||||
if self.in_assoc_ty && !vis.is_at_least(self.required_visibility, self.tcx) {
|
||||
let vis_descr = match vis {
|
||||
ty::Visibility::Public => "public",
|
||||
@@ -1441,6 +1439,8 @@ fn check_def_id(&mut self, def_id: DefId, kind: &str, descr: &dyn fmt::Display)
|
||||
}
|
||||
};
|
||||
|
||||
let span = self.tcx.def_span(self.item_def_id.to_def_id());
|
||||
let vis_span = self.tcx.def_span(def_id);
|
||||
self.tcx.dcx().emit_err(InPublicInterface {
|
||||
span,
|
||||
vis_descr,
|
||||
@@ -1463,6 +1463,8 @@ fn check_def_id(&mut self, def_id: DefId, kind: &str, descr: &dyn fmt::Display)
|
||||
} else {
|
||||
lint::builtin::PRIVATE_BOUNDS
|
||||
};
|
||||
let span = self.tcx.def_span(self.item_def_id.to_def_id());
|
||||
let vis_span = self.tcx.def_span(def_id);
|
||||
self.tcx.emit_node_span_lint(
|
||||
lint,
|
||||
self.tcx.local_def_id_to_hir_id(self.item_def_id),
|
||||
@@ -1594,7 +1596,7 @@ fn get(&self, def_id: LocalDefId) -> Option<EffectiveVisibility> {
|
||||
self.effective_visibilities.effective_vis(def_id).copied()
|
||||
}
|
||||
|
||||
fn check_item(&mut self, id: ItemId) {
|
||||
fn check_item(&self, id: ItemId) {
|
||||
let tcx = self.tcx;
|
||||
let def_id = id.owner_id.def_id;
|
||||
let item_visibility = tcx.local_visibility(def_id);
|
||||
@@ -1722,7 +1724,7 @@ fn check_item(&mut self, id: ItemId) {
|
||||
}
|
||||
}
|
||||
|
||||
fn check_foreign_item(&mut self, id: ForeignItemId) {
|
||||
fn check_foreign_item(&self, id: ForeignItemId) {
|
||||
let tcx = self.tcx;
|
||||
let def_id = id.owner_id.def_id;
|
||||
let item_visibility = tcx.local_visibility(def_id);
|
||||
@@ -1854,16 +1856,12 @@ fn effective_visibilities(tcx: TyCtxt<'_>, (): ()) -> &EffectiveVisibilities {
|
||||
tcx.arena.alloc(visitor.effective_visibilities)
|
||||
}
|
||||
|
||||
fn check_private_in_public(tcx: TyCtxt<'_>, (): ()) {
|
||||
fn check_private_in_public(tcx: TyCtxt<'_>, module_def_id: LocalModDefId) {
|
||||
let effective_visibilities = tcx.effective_visibilities(());
|
||||
// Check for private types in public interfaces.
|
||||
let mut checker = PrivateItemsInPublicInterfacesChecker { tcx, effective_visibilities };
|
||||
let checker = PrivateItemsInPublicInterfacesChecker { tcx, effective_visibilities };
|
||||
|
||||
let crate_items = tcx.hir_crate_items(());
|
||||
for id in crate_items.free_items() {
|
||||
checker.check_item(id);
|
||||
}
|
||||
for id in crate_items.foreign_items() {
|
||||
checker.check_foreign_item(id);
|
||||
}
|
||||
let crate_items = tcx.hir_module_items(module_def_id);
|
||||
let _ = crate_items.par_items(|id| Ok(checker.check_item(id)));
|
||||
let _ = crate_items.par_foreign_items(|id| Ok(checker.check_foreign_item(id)));
|
||||
}
|
||||
|
||||
@@ -93,6 +93,42 @@ LL | struct Priv;
|
||||
LL | type Alias = Priv;
|
||||
| ^^^^^^^^^^ can't leak private type
|
||||
|
||||
error: type `types::Priv` is more private than the item `types::ES`
|
||||
--> $DIR/private-in-public-warn.rs:27:9
|
||||
|
|
||||
LL | pub static ES: Priv;
|
||||
| ^^^^^^^^^^^^^^^^^^^ static `types::ES` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `types::Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/private-in-public-warn.rs:9:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: type `types::Priv` is more private than the item `types::ef1`
|
||||
--> $DIR/private-in-public-warn.rs:28:9
|
||||
|
|
||||
LL | pub fn ef1(arg: Priv);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ function `types::ef1` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `types::Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/private-in-public-warn.rs:9:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: type `types::Priv` is more private than the item `types::ef2`
|
||||
--> $DIR/private-in-public-warn.rs:29:9
|
||||
|
|
||||
LL | pub fn ef2() -> Priv;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ function `types::ef2` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `types::Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/private-in-public-warn.rs:9:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: trait `traits::PrivTr` is more private than the item `traits::Alias`
|
||||
--> $DIR/private-in-public-warn.rs:42:5
|
||||
|
|
||||
@@ -359,42 +395,6 @@ note: but type `Priv2` is only usable at visibility `pub(self)`
|
||||
LL | struct Priv2;
|
||||
| ^^^^^^^^^^^^
|
||||
|
||||
error: type `types::Priv` is more private than the item `types::ES`
|
||||
--> $DIR/private-in-public-warn.rs:27:9
|
||||
|
|
||||
LL | pub static ES: Priv;
|
||||
| ^^^^^^^^^^^^^^^^^^^ static `types::ES` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `types::Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/private-in-public-warn.rs:9:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: type `types::Priv` is more private than the item `types::ef1`
|
||||
--> $DIR/private-in-public-warn.rs:28:9
|
||||
|
|
||||
LL | pub fn ef1(arg: Priv);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ function `types::ef1` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `types::Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/private-in-public-warn.rs:9:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: type `types::Priv` is more private than the item `types::ef2`
|
||||
--> $DIR/private-in-public-warn.rs:29:9
|
||||
|
|
||||
LL | pub fn ef2() -> Priv;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^ function `types::ef2` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `types::Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/private-in-public-warn.rs:9:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: bounds on generic parameters in type aliases are not enforced
|
||||
--> $DIR/private-in-public-warn.rs:42:23
|
||||
|
|
||||
|
||||
@@ -1,16 +1,3 @@
|
||||
warning: type `Priv` is more private than the item `Leak`
|
||||
--> $DIR/projections.rs:3:5
|
||||
|
|
||||
LL | pub type Leak = Priv;
|
||||
| ^^^^^^^^^^^^^ type alias `Leak` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/projections.rs:2:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
= note: `#[warn(private_interfaces)]` on by default
|
||||
|
||||
error[E0446]: private type `Priv` in public interface
|
||||
--> $DIR/projections.rs:24:5
|
||||
|
|
||||
@@ -29,6 +16,19 @@ LL | struct Priv;
|
||||
LL | type A<T: Trait> = T::A<m::Leak>;
|
||||
| ^^^^^^^^^^^^^^^^ can't leak private type
|
||||
|
||||
warning: type `Priv` is more private than the item `Leak`
|
||||
--> $DIR/projections.rs:3:5
|
||||
|
|
||||
LL | pub type Leak = Priv;
|
||||
| ^^^^^^^^^^^^^ type alias `Leak` is reachable at visibility `pub(crate)`
|
||||
|
|
||||
note: but type `Priv` is only usable at visibility `pub(self)`
|
||||
--> $DIR/projections.rs:2:5
|
||||
|
|
||||
LL | struct Priv;
|
||||
| ^^^^^^^^^^^
|
||||
= note: `#[warn(private_interfaces)]` on by default
|
||||
|
||||
error: type `Priv` is private
|
||||
--> $DIR/projections.rs:14:15
|
||||
|
|
||||
|
||||
Reference in New Issue
Block a user