From 0f090e599e1b97b49de62100f9d87621c5fcbb32 Mon Sep 17 00:00:00 2001 From: bohan Date: Sun, 29 Oct 2023 01:37:55 +0800 Subject: [PATCH] vis note for no pub reexports glob import --- compiler/rustc_middle/src/ty/mod.rs | 1 + compiler/rustc_privacy/messages.ftl | 4 +++ compiler/rustc_privacy/src/errors.rs | 7 ++++ compiler/rustc_privacy/src/lib.rs | 17 +++++++-- compiler/rustc_resolve/messages.ftl | 3 -- compiler/rustc_resolve/src/imports.rs | 10 ++---- compiler/rustc_resolve/src/lib.rs | 5 +++ tests/ui/imports/no-reexports-but-used.rs | 14 ++++++++ tests/ui/imports/no-reexports-but-used.stderr | 11 ++++++ tests/ui/imports/reexports.rs | 3 +- tests/ui/imports/reexports.stderr | 20 ++++------- ...sue-46209-private-enum-variant-reexport.rs | 9 ++--- ...46209-private-enum-variant-reexport.stderr | 36 +++++-------------- tests/ui/privacy/private-variant-reexport.rs | 3 +- .../privacy/private-variant-reexport.stderr | 10 ++---- 15 files changed, 83 insertions(+), 70 deletions(-) create mode 100644 tests/ui/imports/no-reexports-but-used.rs create mode 100644 tests/ui/imports/no-reexports-but-used.stderr diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index 739d4fa886ec3..1e9a9a177b85b 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -179,6 +179,7 @@ pub struct ResolverGlobalCtxt { pub doc_link_resolutions: FxHashMap, pub doc_link_traits_in_scope: FxHashMap>, pub all_macro_rules: FxHashMap>, + pub insufficient_vis: Vec<(LocalDefId, ty::Visibility)>, } /// Resolutions that should only be used for lowering. diff --git a/compiler/rustc_privacy/messages.ftl b/compiler/rustc_privacy/messages.ftl index 7785f1a7f81fb..f603d4b0e612d 100644 --- a/compiler/rustc_privacy/messages.ftl +++ b/compiler/rustc_privacy/messages.ftl @@ -5,6 +5,10 @@ privacy_field_is_private_label = private field privacy_from_private_dep_in_public_interface = {$kind} `{$descr}` from private dependency '{$krate}' in public interface +privacy_glob_import_doesnt_reexport = + glob import doesn't reexport anything because no candidate is public enough + .note = the most public imported item is `{$max_vis}` + privacy_in_public_interface = {$vis_descr} {$kind} `{$descr}` in public interface .label = can't leak {$vis_descr} {$kind} .visibility_label = `{$descr}` declared as {$vis_descr} diff --git a/compiler/rustc_privacy/src/errors.rs b/compiler/rustc_privacy/src/errors.rs index b1242f82f4fec..bfdc16dc5d597 100644 --- a/compiler/rustc_privacy/src/errors.rs +++ b/compiler/rustc_privacy/src/errors.rs @@ -104,3 +104,10 @@ pub struct PrivateInterfacesOrBoundsLint<'a> { pub ty_descr: DiagnosticArgFromDisplay<'a>, pub ty_vis_descr: &'a str, } + +#[derive(LintDiagnostic)] +#[diag(privacy_glob_import_doesnt_reexport)] +#[note] +pub struct InsufficientVisibility { + pub max_vis: String, +} diff --git a/compiler/rustc_privacy/src/lib.rs b/compiler/rustc_privacy/src/lib.rs index 4bb7e65747f70..24365ccf7f3ea 100644 --- a/compiler/rustc_privacy/src/lib.rs +++ b/compiler/rustc_privacy/src/lib.rs @@ -45,8 +45,8 @@ use std::{fmt, mem}; use errors::{ FieldIsPrivate, FieldIsPrivateLabel, FromPrivateDependencyInPublicInterface, InPublicInterface, - ItemIsPrivate, PrivateInterfacesOrBoundsLint, ReportEffectiveVisibility, UnnameableTypesLint, - UnnamedItemIsPrivate, + InsufficientVisibility, ItemIsPrivate, PrivateInterfacesOrBoundsLint, + ReportEffectiveVisibility, UnnameableTypesLint, UnnamedItemIsPrivate, }; fluent_messages! { "../messages.ftl" } @@ -1935,4 +1935,17 @@ fn check_private_in_public(tcx: TyCtxt<'_>, (): ()) { for id in tcx.hir().items() { checker.check_item(id); } + + report_insufficient_visibility(tcx); +} + +fn report_insufficient_visibility(tcx: TyCtxt<'_>) { + for (def_id, vis) in &tcx.resolutions(()).insufficient_vis { + tcx.emit_spanned_lint( + lint::builtin::UNUSED_IMPORTS, + tcx.hir().local_def_id_to_hir_id(*def_id), + tcx.def_span(def_id.to_def_id()), + InsufficientVisibility { max_vis: vis_to_string(*def_id, *vis, tcx) }, + ); + } } diff --git a/compiler/rustc_resolve/messages.ftl b/compiler/rustc_resolve/messages.ftl index 272483d4a9876..3662edcc1c05b 100644 --- a/compiler/rustc_resolve/messages.ftl +++ b/compiler/rustc_resolve/messages.ftl @@ -127,9 +127,6 @@ resolve_generic_params_from_outer_item_self_ty_param = can't use `Self` here resolve_generic_params_from_outer_item_ty_param = type parameter from outer item -resolve_glob_import_doesnt_reexport = - glob import doesn't reexport anything because no candidate is public enough - resolve_ident_bound_more_than_once_in_parameter_list = identifier `{$identifier}` is bound more than once in this parameter list .label = used as parameter more than once diff --git a/compiler/rustc_resolve/src/imports.rs b/compiler/rustc_resolve/src/imports.rs index b34790a925ea8..8aa5b3d0569b8 100644 --- a/compiler/rustc_resolve/src/imports.rs +++ b/compiler/rustc_resolve/src/imports.rs @@ -8,7 +8,7 @@ use crate::errors::{ ItemsInTraitsAreNotImportable, }; use crate::Determinacy::{self, *}; -use crate::{fluent_generated as fluent, Namespace::*}; +use crate::Namespace::*; use crate::{module_to_string, names_to_string, ImportSuggestion}; use crate::{AmbiguityKind, BindingKey, ModuleKind, ResolutionError, Resolver, Segment}; use crate::{Finalize, Module, ModuleOrUniformRoot, ParentScope, PerNS, ScopeSet}; @@ -989,12 +989,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { && let Some(max_vis) = max_vis.get() && !max_vis.is_at_least(import.expect_vis(), self.tcx) { - self.lint_buffer.buffer_lint( - UNUSED_IMPORTS, - id, - import.span, - fluent::resolve_glob_import_doesnt_reexport, - ); + let def_id = self.local_def_id(id); + self.insufficient_vis.push((def_id, max_vis)); } return None; } diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index 501747df5c908..6880a75c346b1 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -958,6 +958,8 @@ pub struct Resolver<'a, 'tcx> { /// All non-determined imports. indeterminate_imports: Vec>, + insufficient_vis: Vec<(LocalDefId, ty::Visibility)>, + // Spans for local variables found during pattern resolution. // Used for suggestions during error reporting. pat_span_map: NodeMap, @@ -1340,6 +1342,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { determined_imports: Vec::new(), indeterminate_imports: Vec::new(), + insufficient_vis: Vec::new(), + pat_span_map: Default::default(), partial_res_map: Default::default(), import_res_map: Default::default(), @@ -1525,6 +1529,7 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> { doc_link_resolutions: self.doc_link_resolutions, doc_link_traits_in_scope: self.doc_link_traits_in_scope, all_macro_rules: self.all_macro_rules, + insufficient_vis: self.insufficient_vis, }; let ast_lowering = ty::ResolverAstLowering { legacy_const_generic_args: self.legacy_const_generic_args, diff --git a/tests/ui/imports/no-reexports-but-used.rs b/tests/ui/imports/no-reexports-but-used.rs new file mode 100644 index 0000000000000..7580e1ee8ffbb --- /dev/null +++ b/tests/ui/imports/no-reexports-but-used.rs @@ -0,0 +1,14 @@ +// run-pass +// https://github.com/rust-lang/rust/issues/115966 + +mod m { + pub(crate) type A = u8; +} + +pub use m::*; +//~^ WARNING: glob import doesn't reexport anything because no candidate is public enough +//~| NOTE: the most public imported item is `pub(crate)` +//~| NOTE: #[warn(unused_imports)]` on by default +fn main() { + let _: A; +} diff --git a/tests/ui/imports/no-reexports-but-used.stderr b/tests/ui/imports/no-reexports-but-used.stderr new file mode 100644 index 0000000000000..cd27fc0abfcbe --- /dev/null +++ b/tests/ui/imports/no-reexports-but-used.stderr @@ -0,0 +1,11 @@ +warning: glob import doesn't reexport anything because no candidate is public enough + --> $DIR/no-reexports-but-used.rs:8:9 + | +LL | pub use m::*; + | ^ + | + = note: the most public imported item is `pub(crate)` + = note: `#[warn(unused_imports)]` on by default + +warning: 1 warning emitted + diff --git a/tests/ui/imports/reexports.rs b/tests/ui/imports/reexports.rs index cb1a3ebe18028..6f91b18645b5e 100644 --- a/tests/ui/imports/reexports.rs +++ b/tests/ui/imports/reexports.rs @@ -9,8 +9,7 @@ mod a { //~^ ERROR cannot be re-exported //~| WARNING unused import: `super::foo` pub use super::*; - //~^ WARNING glob import doesn't reexport anything because no candidate is public enough - //~| WARNING unused import: `super::*` + //~^ WARNING unused import: `super::*` } } diff --git a/tests/ui/imports/reexports.stderr b/tests/ui/imports/reexports.stderr index 401e422af0f8e..ece39ef4be87d 100644 --- a/tests/ui/imports/reexports.stderr +++ b/tests/ui/imports/reexports.stderr @@ -11,35 +11,35 @@ LL | pub use super::foo; | ^^^^^^^^^^ error[E0603]: module import `foo` is private - --> $DIR/reexports.rs:36:15 + --> $DIR/reexports.rs:35:15 | LL | use b::a::foo::S; | ^^^ private module import | note: the module import `foo` is defined here... - --> $DIR/reexports.rs:24:17 + --> $DIR/reexports.rs:23:17 | LL | pub use super::foo; // This is OK since the value `foo` is visible enough. | ^^^^^^^^^^ note: ...and refers to the module `foo` which is defined here - --> $DIR/reexports.rs:19:5 + --> $DIR/reexports.rs:18:5 | LL | mod foo { | ^^^^^^^ error[E0603]: module import `foo` is private - --> $DIR/reexports.rs:37:15 + --> $DIR/reexports.rs:36:15 | LL | use b::b::foo::S as T; | ^^^ private module import | note: the module import `foo` is defined here... - --> $DIR/reexports.rs:29:17 + --> $DIR/reexports.rs:28:17 | LL | pub use super::*; // This is also OK since the value `foo` is visible enough. | ^^^^^^^^ note: ...and refers to the module `foo` which is defined here - --> $DIR/reexports.rs:19:5 + --> $DIR/reexports.rs:18:5 | LL | mod foo { | ^^^^^^^ @@ -56,19 +56,13 @@ note: the lint level is defined here LL | #![warn(unused_imports)] | ^^^^^^^^^^^^^^ -warning: glob import doesn't reexport anything because no candidate is public enough - --> $DIR/reexports.rs:11:17 - | -LL | pub use super::*; - | ^^^^^^^^ - warning: unused import: `super::*` --> $DIR/reexports.rs:11:17 | LL | pub use super::*; | ^^^^^^^^ -error: aborting due to 3 previous errors; 3 warnings emitted +error: aborting due to 3 previous errors; 2 warnings emitted Some errors have detailed explanations: E0364, E0603. For more information about an error, try `rustc --explain E0364`. diff --git a/tests/ui/privacy/issue-46209-private-enum-variant-reexport.rs b/tests/ui/privacy/issue-46209-private-enum-variant-reexport.rs index 653dcab577148..3d10855c427e7 100644 --- a/tests/ui/privacy/issue-46209-private-enum-variant-reexport.rs +++ b/tests/ui/privacy/issue-46209-private-enum-variant-reexport.rs @@ -1,18 +1,15 @@ #[deny(unused_imports)] mod rank { pub use self::Professor::*; - //~^ ERROR glob import doesn't reexport anything - //~| ERROR unused import: `self::Professor::*` + //~^ ERROR unused import: `self::Professor::*` pub use self::Lieutenant::{JuniorGrade, Full}; //~^ ERROR `JuniorGrade` is private, and cannot be re-exported //~| ERROR `Full` is private, and cannot be re-exported //~| ERROR unused imports: `Full`, `JuniorGrade` pub use self::PettyOfficer::*; - //~^ ERROR glob import doesn't reexport anything - //~| ERROR unused import: `self::PettyOfficer::*` + //~^ ERROR unused import: `self::PettyOfficer::*` pub use self::Crewman::*; - //~^ ERROR glob import doesn't reexport anything - //~| ERROR unused import: `self::Crewman::*` + //~^ ERROR unused import: `self::Crewman::*` enum Professor { Adjunct, diff --git a/tests/ui/privacy/issue-46209-private-enum-variant-reexport.stderr b/tests/ui/privacy/issue-46209-private-enum-variant-reexport.stderr index df5968ba323b3..cdeb4c6a8013d 100644 --- a/tests/ui/privacy/issue-46209-private-enum-variant-reexport.stderr +++ b/tests/ui/privacy/issue-46209-private-enum-variant-reexport.stderr @@ -1,28 +1,28 @@ error[E0364]: `JuniorGrade` is private, and cannot be re-exported - --> $DIR/issue-46209-private-enum-variant-reexport.rs:6:32 + --> $DIR/issue-46209-private-enum-variant-reexport.rs:5:32 | LL | pub use self::Lieutenant::{JuniorGrade, Full}; | ^^^^^^^^^^^ | note: consider marking `JuniorGrade` as `pub` in the imported module - --> $DIR/issue-46209-private-enum-variant-reexport.rs:6:32 + --> $DIR/issue-46209-private-enum-variant-reexport.rs:5:32 | LL | pub use self::Lieutenant::{JuniorGrade, Full}; | ^^^^^^^^^^^ error[E0364]: `Full` is private, and cannot be re-exported - --> $DIR/issue-46209-private-enum-variant-reexport.rs:6:45 + --> $DIR/issue-46209-private-enum-variant-reexport.rs:5:45 | LL | pub use self::Lieutenant::{JuniorGrade, Full}; | ^^^^ | note: consider marking `Full` as `pub` in the imported module - --> $DIR/issue-46209-private-enum-variant-reexport.rs:6:45 + --> $DIR/issue-46209-private-enum-variant-reexport.rs:5:45 | LL | pub use self::Lieutenant::{JuniorGrade, Full}; | ^^^^ -error: glob import doesn't reexport anything because no candidate is public enough +error: unused import: `self::Professor::*` --> $DIR/issue-46209-private-enum-variant-reexport.rs:3:13 | LL | pub use self::Professor::*; @@ -34,42 +34,24 @@ note: the lint level is defined here LL | #[deny(unused_imports)] | ^^^^^^^^^^^^^^ -error: unused import: `self::Professor::*` - --> $DIR/issue-46209-private-enum-variant-reexport.rs:3:13 - | -LL | pub use self::Professor::*; - | ^^^^^^^^^^^^^^^^^^ - error: unused imports: `Full`, `JuniorGrade` - --> $DIR/issue-46209-private-enum-variant-reexport.rs:6:32 + --> $DIR/issue-46209-private-enum-variant-reexport.rs:5:32 | LL | pub use self::Lieutenant::{JuniorGrade, Full}; | ^^^^^^^^^^^ ^^^^ -error: glob import doesn't reexport anything because no candidate is public enough - --> $DIR/issue-46209-private-enum-variant-reexport.rs:10:13 - | -LL | pub use self::PettyOfficer::*; - | ^^^^^^^^^^^^^^^^^^^^^ - error: unused import: `self::PettyOfficer::*` - --> $DIR/issue-46209-private-enum-variant-reexport.rs:10:13 + --> $DIR/issue-46209-private-enum-variant-reexport.rs:9:13 | LL | pub use self::PettyOfficer::*; | ^^^^^^^^^^^^^^^^^^^^^ -error: glob import doesn't reexport anything because no candidate is public enough - --> $DIR/issue-46209-private-enum-variant-reexport.rs:13:13 - | -LL | pub use self::Crewman::*; - | ^^^^^^^^^^^^^^^^ - error: unused import: `self::Crewman::*` - --> $DIR/issue-46209-private-enum-variant-reexport.rs:13:13 + --> $DIR/issue-46209-private-enum-variant-reexport.rs:11:13 | LL | pub use self::Crewman::*; | ^^^^^^^^^^^^^^^^ -error: aborting due to 9 previous errors +error: aborting due to 6 previous errors For more information about this error, try `rustc --explain E0364`. diff --git a/tests/ui/privacy/private-variant-reexport.rs b/tests/ui/privacy/private-variant-reexport.rs index b59243af62067..c005aa22a91f0 100644 --- a/tests/ui/privacy/private-variant-reexport.rs +++ b/tests/ui/privacy/private-variant-reexport.rs @@ -13,8 +13,7 @@ mod m3 { #[deny(unused_imports)] mod m4 { pub use ::E::*; - //~^ ERROR glob import doesn't reexport anything - //~| ERROR unused import: `::E::*` + //~^ ERROR unused import: `::E::*` } enum E { V } diff --git a/tests/ui/privacy/private-variant-reexport.stderr b/tests/ui/privacy/private-variant-reexport.stderr index 2f041934a8171..ea6b46e0155d3 100644 --- a/tests/ui/privacy/private-variant-reexport.stderr +++ b/tests/ui/privacy/private-variant-reexport.stderr @@ -30,7 +30,7 @@ LL | pub use ::E::V::{self}; | = note: consider declaring type or module `V` with `pub` -error: glob import doesn't reexport anything because no candidate is public enough +error: unused import: `::E::*` --> $DIR/private-variant-reexport.rs:15:13 | LL | pub use ::E::*; @@ -42,13 +42,7 @@ note: the lint level is defined here LL | #[deny(unused_imports)] | ^^^^^^^^^^^^^^ -error: unused import: `::E::*` - --> $DIR/private-variant-reexport.rs:15:13 - | -LL | pub use ::E::*; - | ^^^^^^ - -error: aborting due to 5 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0364, E0365. For more information about an error, try `rustc --explain E0364`.