Skip to content

unused_extern_crates: does not handle cfg attributes #57420

Closed
@ehuss

Description

@ehuss

If an extern crate has a cfg_attr that is not enabled, then it incorrectly suggests removing the extern crate.

#![warn(unused_extern_crates)]

#[cfg_attr(test, macro_use)]
extern crate serde_json;

#[cfg(test)]
pub fn f() {
    json!({})
}

Run cargo fix --lib on the above, and it will remove the extern crate, leaving the attribute floating in limbo. Then, cargo check --lib --profile=test will demonstrate that the code is now broken.

The unused_extern_crates lint tries to avoid firing if there are attributes (see check_unused) but I'm guessing the cfg_attr strips the attribute (or doesn't add it in the first place), so the lint doesn't know there are any attributes.

A similar issue, the unused_extern_crates suggests use when it doesn't work. Given the following:

#![warn(unused_extern_crates)]

#[cfg_attr(test, macro_use)]
extern crate serde_derive as sd;

#[derive(sd::Serialize)]
pub struct Z;

#[cfg(test)]
mod m {
    #[derive(Deserialize)]
    struct S;
}

cargo fix --edition-idioms --lib will convert the extern crate to a use statement, keeping the macro_use attribute which won't work. cargo check --profile=test --lib will the fail to compile.

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-suggestion-diagnosticsArea: Suggestions generated by the compiler applied by `cargo fix`

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions