Skip to content

Commit

Permalink
Do not suggest use over extern crate w/ alias.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
davidtwco committed Apr 25, 2019
1 parent 8a47e08 commit 8869bc5
Show file tree
Hide file tree
Showing 11 changed files with 41 additions and 66 deletions.
7 changes: 7 additions & 0 deletions src/librustc_typeck/check_unused.rs
Expand Up @@ -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.
Expand Down
12 changes: 8 additions & 4 deletions src/test/ui/imports/extern-crate-used.rs
Expand Up @@ -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
Expand Down
34 changes: 5 additions & 29 deletions src/test/ui/imports/extern-crate-used.stderr
@@ -1,38 +1,14 @@
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
|
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

7 changes: 5 additions & 2 deletions src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.fixed
Expand Up @@ -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:
Expand Down
5 changes: 4 additions & 1 deletion src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.rs
Expand Up @@ -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:
Expand Down
8 changes: 1 addition & 7 deletions src/test/ui/rust-2018/extern-crate-idiomatic-in-2018.stderr
Expand Up @@ -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

6 changes: 5 additions & 1 deletion src/test/ui/rust-2018/remove-extern-crate.fixed
Expand Up @@ -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;
Expand Down
4 changes: 4 additions & 0 deletions src/test/ui/rust-2018/remove-extern-crate.rs
Expand Up @@ -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]
Expand Down
8 changes: 1 addition & 7 deletions src/test/ui/rust-2018/remove-extern-crate.stderr
Expand Up @@ -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`
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/suggestions/issue-57672.rs
@@ -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;
Expand Down
14 changes: 0 additions & 14 deletions src/test/ui/suggestions/issue-57672.stderr

This file was deleted.

0 comments on commit 8869bc5

Please sign in to comment.