Do not suggest use over extern crate w/ alias.
This commit stops `unused_extern_crates` lints from occuring on `extern crate` statements that alias the crate as the suggestion to change to a `use` statement would result in the aliased name no longer being added to the prelude, thereby causing compilation errors if other imports expected this to be the case.
This commit is contained in:
parent
8a47e08845
commit
8869bc5ada
11 changed files with 41 additions and 66 deletions
|
@ -158,6 +158,13 @@ fn unused_crates_lint<'tcx>(tcx: TyCtxt<'_, 'tcx, 'tcx>) {
|
|||
continue;
|
||||
}
|
||||
|
||||
// If the extern crate is renamed, then we cannot suggest replacing it with a use as this
|
||||
// would not insert the new name into the prelude, where other imports in the crate may be
|
||||
// expecting it.
|
||||
if extern_crate.orig_name.is_some() {
|
||||
continue;
|
||||
}
|
||||
|
||||
// If the extern crate has any attributes, they may have funky
|
||||
// semantics we can't faithfully represent using `use` (most
|
||||
// notably `#[macro_use]`). Ignore it.
|
||||
|
|
|
@ -5,10 +5,14 @@
|
|||
|
||||
#![deny(unused_extern_crates)]
|
||||
|
||||
extern crate core as iso1; //~ ERROR `extern crate` is not idiomatic in the new edition
|
||||
extern crate core as iso2; //~ ERROR `extern crate` is not idiomatic in the new edition
|
||||
extern crate core as iso3; //~ ERROR `extern crate` is not idiomatic in the new edition
|
||||
extern crate core as iso4; //~ ERROR `extern crate` is not idiomatic in the new edition
|
||||
// Shouldn't suggest changing to `use`, as new name
|
||||
// would no longer be added to the prelude which could cause
|
||||
// compilation errors for imports that use the new name in
|
||||
// other modules. See #57672.
|
||||
extern crate core as iso1;
|
||||
extern crate core as iso2;
|
||||
extern crate core as iso3;
|
||||
extern crate core as iso4;
|
||||
|
||||
// Doesn't introduce its extern prelude entry, so it's still considered unused.
|
||||
extern crate core; //~ ERROR unused extern crate
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
error: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/extern-crate-used.rs:8:1
|
||||
error: unused extern crate
|
||||
--> $DIR/extern-crate-used.rs:18:1
|
||||
|
|
||||
LL | extern crate core as iso1;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
LL | extern crate core;
|
||||
| ^^^^^^^^^^^^^^^^^^ help: remove it
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/extern-crate-used.rs:6:9
|
||||
|
@ -10,29 +10,5 @@ note: lint level defined here
|
|||
LL | #![deny(unused_extern_crates)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/extern-crate-used.rs:9:1
|
||||
|
|
||||
LL | extern crate core as iso2;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
|
||||
error: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/extern-crate-used.rs:10:1
|
||||
|
|
||||
LL | extern crate core as iso3;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
|
||||
error: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/extern-crate-used.rs:11:1
|
||||
|
|
||||
LL | extern crate core as iso4;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
|
||||
error: unused extern crate
|
||||
--> $DIR/extern-crate-used.rs:14:1
|
||||
|
|
||||
LL | extern crate core;
|
||||
| ^^^^^^^^^^^^^^^^^^ help: remove it
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
@ -12,8 +12,11 @@
|
|||
|
||||
//~^ ERROR unused extern crate
|
||||
|
||||
use edition_lint_paths as bar;
|
||||
//~^ ERROR `extern crate` is not idiomatic in the new edition
|
||||
// Shouldn't suggest changing to `use`, as `bar`
|
||||
// would no longer be added to the prelude which could cause
|
||||
// compilation errors for imports that use `bar` in other
|
||||
// modules. See #57672.
|
||||
extern crate edition_lint_paths as bar;
|
||||
|
||||
fn main() {
|
||||
// This is not considered to *use* the `extern crate` in Rust 2018:
|
||||
|
|
|
@ -12,8 +12,11 @@
|
|||
extern crate edition_lint_paths;
|
||||
//~^ ERROR unused extern crate
|
||||
|
||||
// Shouldn't suggest changing to `use`, as `bar`
|
||||
// would no longer be added to the prelude which could cause
|
||||
// compilation errors for imports that use `bar` in other
|
||||
// modules. See #57672.
|
||||
extern crate edition_lint_paths as bar;
|
||||
//~^ ERROR `extern crate` is not idiomatic in the new edition
|
||||
|
||||
fn main() {
|
||||
// This is not considered to *use* the `extern crate` in Rust 2018:
|
||||
|
|
|
@ -11,11 +11,5 @@ LL | #![deny(rust_2018_idioms)]
|
|||
| ^^^^^^^^^^^^^^^^
|
||||
= note: #[deny(unused_extern_crates)] implied by #[deny(rust_2018_idioms)]
|
||||
|
||||
error: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/extern-crate-idiomatic-in-2018.rs:15:1
|
||||
|
|
||||
LL | extern crate edition_lint_paths as bar;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
error: aborting due to previous error
|
||||
|
||||
|
|
|
@ -7,7 +7,11 @@
|
|||
#![warn(rust_2018_idioms)]
|
||||
|
||||
|
||||
use core as another_name;
|
||||
// Shouldn't suggest changing to `use`, as `another_name`
|
||||
// would no longer be added to the prelude which could cause
|
||||
// compilation errors for imports that use `another_name` in other
|
||||
// modules. See #57672.
|
||||
extern crate core as another_name;
|
||||
use remove_extern_crate;
|
||||
#[macro_use]
|
||||
extern crate remove_extern_crate as something_else;
|
||||
|
|
|
@ -7,6 +7,10 @@
|
|||
#![warn(rust_2018_idioms)]
|
||||
|
||||
extern crate core;
|
||||
// Shouldn't suggest changing to `use`, as `another_name`
|
||||
// would no longer be added to the prelude which could cause
|
||||
// compilation errors for imports that use `another_name` in other
|
||||
// modules. See #57672.
|
||||
extern crate core as another_name;
|
||||
use remove_extern_crate;
|
||||
#[macro_use]
|
||||
|
|
|
@ -12,13 +12,7 @@ LL | #![warn(rust_2018_idioms)]
|
|||
= note: #[warn(unused_extern_crates)] implied by #[warn(rust_2018_idioms)]
|
||||
|
||||
warning: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/remove-extern-crate.rs:10:1
|
||||
|
|
||||
LL | extern crate core as another_name;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
|
||||
warning: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/remove-extern-crate.rs:28:5
|
||||
--> $DIR/remove-extern-crate.rs:32:5
|
||||
|
|
||||
LL | extern crate core;
|
||||
| ^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
// aux-build:foo.rs
|
||||
// compile-flags:--extern foo
|
||||
// compile-pass
|
||||
// edition:2018
|
||||
|
||||
#![deny(unused_extern_crates)]
|
||||
|
||||
extern crate foo as foo_renamed;
|
||||
//~^ ERROR `extern crate` is not idiomatic in the new edition
|
||||
|
||||
pub mod m {
|
||||
pub use foo_renamed::Foo;
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
error: `extern crate` is not idiomatic in the new edition
|
||||
--> $DIR/issue-57672.rs:7:1
|
||||
|
|
||||
LL | extern crate foo as foo_renamed;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: convert it to a `use`
|
||||
|
|
||||
note: lint level defined here
|
||||
--> $DIR/issue-57672.rs:5:9
|
||||
|
|
||||
LL | #![deny(unused_extern_crates)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Add table
Reference in a new issue