Rollup merge of #80763 - petrochenkov:pubusecrate, r=estebank
resolve: Reduce scope of `pub_use_of_private_extern_crate` deprecation lint This lint was deny-by-default since July 2017, crater showed 7 uses on crates.io back then (https://github.com/rust-lang/rust/pull/42894#issuecomment-311921147). Unfortunately, the construction `pub use foo as bar` where `foo` is `extern crate foo;` was used by an older version `bitflags`, so turning it into an error causes too many regressions. So, this PR reduces the scope of the lint instead of turning it into a hard error, and only turns some more rarely used components of it into errors.
This commit is contained in:
commit
ec2619ca62
5 changed files with 50 additions and 39 deletions
|
@ -156,6 +156,21 @@ impl<'a> NameResolution<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reexports of the form `pub use foo as bar;` where `foo` is `extern crate foo;`
|
||||||
|
// are permitted for backward-compatibility under a deprecation lint.
|
||||||
|
fn pub_use_of_private_extern_crate_hack(import: &Import<'_>, binding: &NameBinding<'_>) -> bool {
|
||||||
|
match (&import.kind, &binding.kind) {
|
||||||
|
(
|
||||||
|
ImportKind::Single { .. },
|
||||||
|
NameBindingKind::Import {
|
||||||
|
import: Import { kind: ImportKind::ExternCrate { .. }, .. },
|
||||||
|
..
|
||||||
|
},
|
||||||
|
) => import.vis.get() == ty::Visibility::Public,
|
||||||
|
_ => false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> Resolver<'a> {
|
impl<'a> Resolver<'a> {
|
||||||
crate fn resolve_ident_in_module_unadjusted(
|
crate fn resolve_ident_in_module_unadjusted(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
@ -263,10 +278,7 @@ impl<'a> Resolver<'a> {
|
||||||
return Err((Determined, Weak::No));
|
return Err((Determined, Weak::No));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// `extern crate` are always usable for backwards compatibility, see issue #37020,
|
let usable = this.is_accessible_from(binding.vis, parent_scope.module);
|
||||||
// remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`.
|
|
||||||
let usable = this.is_accessible_from(binding.vis, parent_scope.module)
|
|
||||||
|| binding.is_extern_crate();
|
|
||||||
if usable { Ok(binding) } else { Err((Determined, Weak::No)) }
|
if usable { Ok(binding) } else { Err((Determined, Weak::No)) }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -309,10 +321,7 @@ impl<'a> Resolver<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !(self.is_accessible_from(binding.vis, parent_scope.module) ||
|
if !self.is_accessible_from(binding.vis, parent_scope.module) {
|
||||||
// Remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`
|
|
||||||
(self.last_import_segment && binding.is_extern_crate()))
|
|
||||||
{
|
|
||||||
self.privacy_errors.push(PrivacyError {
|
self.privacy_errors.push(PrivacyError {
|
||||||
ident,
|
ident,
|
||||||
binding,
|
binding,
|
||||||
|
@ -455,9 +464,8 @@ impl<'a> Resolver<'a> {
|
||||||
binding: &'a NameBinding<'a>,
|
binding: &'a NameBinding<'a>,
|
||||||
import: &'a Import<'a>,
|
import: &'a Import<'a>,
|
||||||
) -> &'a NameBinding<'a> {
|
) -> &'a NameBinding<'a> {
|
||||||
let vis = if binding.vis.is_at_least(import.vis.get(), self) ||
|
let vis = if binding.vis.is_at_least(import.vis.get(), self)
|
||||||
// cf. `PUB_USE_OF_PRIVATE_EXTERN_CRATE`
|
|| pub_use_of_private_extern_crate_hack(import, binding)
|
||||||
!import.is_glob() && binding.is_extern_crate()
|
|
||||||
{
|
{
|
||||||
import.vis.get()
|
import.vis.get()
|
||||||
} else {
|
} else {
|
||||||
|
@ -1188,7 +1196,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> {
|
||||||
// All namespaces must be re-exported with extra visibility for an error to occur.
|
// All namespaces must be re-exported with extra visibility for an error to occur.
|
||||||
if !any_successful_reexport {
|
if !any_successful_reexport {
|
||||||
let (ns, binding) = reexport_error.unwrap();
|
let (ns, binding) = reexport_error.unwrap();
|
||||||
if ns == TypeNS && binding.is_extern_crate() {
|
if pub_use_of_private_extern_crate_hack(import, binding) {
|
||||||
let msg = format!(
|
let msg = format!(
|
||||||
"extern crate `{}` is private, and cannot be \
|
"extern crate `{}` is private, and cannot be \
|
||||||
re-exported (error E0365), consider declaring with \
|
re-exported (error E0365), consider declaring with \
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#![crate_name = "foo"]
|
#![crate_name = "foo"]
|
||||||
|
|
||||||
extern crate extern_links;
|
pub extern crate extern_links;
|
||||||
|
|
||||||
// @!has foo/index.html '//a' 'extern_links'
|
// @!has foo/index.html '//a' 'extern_links'
|
||||||
#[doc(no_inline)]
|
#[doc(no_inline)]
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
// aux-build:issue-28927-1.rs
|
// aux-build:issue-28927-1.rs
|
||||||
// ignore-cross-compile
|
// ignore-cross-compile
|
||||||
|
|
||||||
extern crate issue_28927_1 as inner1;
|
pub extern crate issue_28927_1 as inner1;
|
||||||
pub use inner1 as foo;
|
pub use inner1 as foo;
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
#![allow(unused)]
|
|
||||||
|
|
||||||
extern crate core;
|
extern crate core;
|
||||||
pub use core as reexported_core; //~ ERROR `core` is private, and cannot be re-exported
|
pub use core as reexported_core; //~ ERROR `core` is private, and cannot be re-exported
|
||||||
//~^ WARN this was previously accepted
|
//~^ WARN this was previously accepted
|
||||||
|
@ -9,16 +7,14 @@ mod foo1 {
|
||||||
}
|
}
|
||||||
|
|
||||||
mod foo2 {
|
mod foo2 {
|
||||||
use foo1::core; //~ ERROR `core` is private, and cannot be re-exported
|
use foo1::core; //~ ERROR crate import `core` is private
|
||||||
//~^ WARN this was previously accepted
|
|
||||||
pub mod bar {
|
pub mod bar {
|
||||||
extern crate core;
|
extern crate core;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mod baz {
|
mod baz {
|
||||||
pub use foo2::bar::core; //~ ERROR `core` is private, and cannot be re-exported
|
pub use foo2::bar::core; //~ ERROR crate import `core` is private
|
||||||
//~^ WARN this was previously accepted
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
|
|
@ -1,5 +1,29 @@
|
||||||
|
error[E0603]: crate import `core` is private
|
||||||
|
--> $DIR/pub-reexport-priv-extern-crate.rs:10:15
|
||||||
|
|
|
||||||
|
LL | use foo1::core;
|
||||||
|
| ^^^^ private crate import
|
||||||
|
|
|
||||||
|
note: the crate import `core` is defined here
|
||||||
|
--> $DIR/pub-reexport-priv-extern-crate.rs:6:5
|
||||||
|
|
|
||||||
|
LL | extern crate core;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
error[E0603]: crate import `core` is private
|
||||||
|
--> $DIR/pub-reexport-priv-extern-crate.rs:17:24
|
||||||
|
|
|
||||||
|
LL | pub use foo2::bar::core;
|
||||||
|
| ^^^^ private crate import
|
||||||
|
|
|
||||||
|
note: the crate import `core` is defined here
|
||||||
|
--> $DIR/pub-reexport-priv-extern-crate.rs:12:9
|
||||||
|
|
|
||||||
|
LL | extern crate core;
|
||||||
|
| ^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: extern crate `core` is private, and cannot be re-exported (error E0365), consider declaring with `pub`
|
error: extern crate `core` is private, and cannot be re-exported (error E0365), consider declaring with `pub`
|
||||||
--> $DIR/pub-reexport-priv-extern-crate.rs:4:9
|
--> $DIR/pub-reexport-priv-extern-crate.rs:2:9
|
||||||
|
|
|
|
||||||
LL | pub use core as reexported_core;
|
LL | pub use core as reexported_core;
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -8,23 +32,6 @@ LL | pub use core as reexported_core;
|
||||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
||||||
|
|
||||||
error: extern crate `core` is private, and cannot be re-exported (error E0365), consider declaring with `pub`
|
|
||||||
--> $DIR/pub-reexport-priv-extern-crate.rs:12:9
|
|
||||||
|
|
|
||||||
LL | use foo1::core;
|
|
||||||
| ^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
|
||||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
|
||||||
|
|
||||||
error: extern crate `core` is private, and cannot be re-exported (error E0365), consider declaring with `pub`
|
|
||||||
--> $DIR/pub-reexport-priv-extern-crate.rs:20:13
|
|
||||||
|
|
|
||||||
LL | pub use foo2::bar::core;
|
|
||||||
| ^^^^^^^^^^^^^^^
|
|
||||||
|
|
|
||||||
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
|
||||||
= note: for more information, see issue #34537 <https://github.com/rust-lang/rust/issues/34537>
|
|
||||||
|
|
||||||
error: aborting due to 3 previous errors
|
error: aborting due to 3 previous errors
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0603`.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue