deprecate mismatched_target_os

This commit is contained in:
y21 2024-06-01 14:11:07 +02:00
parent 4aa20d2e95
commit f950961c42
13 changed files with 25 additions and 519 deletions

View File

@ -1,90 +0,0 @@
use super::{Attribute, MISMATCHED_TARGET_OS};
use clippy_utils::diagnostics::span_lint_and_then;
use rustc_ast::{MetaItemKind, NestedMetaItem};
use rustc_errors::Applicability;
use rustc_lint::EarlyContext;
use rustc_span::{sym, Span};
static UNIX_SYSTEMS: &[&str] = &[
"android",
"dragonfly",
"emscripten",
"freebsd",
"fuchsia",
"haiku",
"illumos",
"ios",
"l4re",
"linux",
"macos",
"netbsd",
"openbsd",
"redox",
"solaris",
"vxworks",
];
// NOTE: windows is excluded from the list because it's also a valid target family.
static NON_UNIX_SYSTEMS: &[&str] = &["hermit", "none", "wasi"];
pub(super) fn check(cx: &EarlyContext<'_>, attr: &Attribute) {
fn find_os(name: &str) -> Option<&'static str> {
UNIX_SYSTEMS
.iter()
.chain(NON_UNIX_SYSTEMS.iter())
.find(|&&os| os == name)
.copied()
}
fn is_unix(name: &str) -> bool {
UNIX_SYSTEMS.iter().any(|&os| os == name)
}
fn find_mismatched_target_os(items: &[NestedMetaItem]) -> Vec<(&str, Span)> {
let mut mismatched = Vec::new();
for item in items {
if let NestedMetaItem::MetaItem(meta) = item {
match &meta.kind {
MetaItemKind::List(list) => {
mismatched.extend(find_mismatched_target_os(list));
},
MetaItemKind::Word => {
if let Some(ident) = meta.ident()
&& let Some(os) = find_os(ident.name.as_str())
{
mismatched.push((os, ident.span));
}
},
MetaItemKind::NameValue(..) => {},
}
}
}
mismatched
}
if attr.has_name(sym::cfg)
&& let Some(list) = attr.meta_item_list()
&& let mismatched = find_mismatched_target_os(&list)
&& !mismatched.is_empty()
{
let mess = "operating system used in target family position";
span_lint_and_then(cx, MISMATCHED_TARGET_OS, attr.span, mess, |diag| {
// Avoid showing the unix suggestion multiple times in case
// we have more than one mismatch for unix-like systems
let mut unix_suggested = false;
for (os, span) in mismatched {
let sugg = format!("target_os = \"{os}\"");
diag.span_suggestion(span, "try", sugg, Applicability::MaybeIncorrect);
if !unix_suggested && is_unix(os) {
diag.help("did you mean `unix`?");
unix_suggested = true;
}
}
});
}
}

View File

@ -7,7 +7,6 @@ mod deprecated_semver;
mod duplicated_attributes;
mod empty_line_after;
mod inline_always;
mod mismatched_target_os;
mod mixed_attributes_style;
mod non_minimal_cfg;
mod should_panic_without_expect;
@ -269,39 +268,6 @@ declare_clippy_lint! {
"usage of `cfg_attr(rustfmt)` instead of tool attributes"
}
declare_clippy_lint! {
/// ### What it does
/// Checks for cfg attributes having operating systems used in target family position.
///
/// ### Why is this bad?
/// The configuration option will not be recognised and the related item will not be included
/// by the conditional compilation engine.
///
/// ### Example
/// ```no_run
/// #[cfg(linux)]
/// fn conditional() { }
/// ```
///
/// Use instead:
/// ```no_run
/// # mod hidden {
/// #[cfg(target_os = "linux")]
/// fn conditional() { }
/// # }
///
/// // or
///
/// #[cfg(unix)]
/// fn conditional() { }
/// ```
/// Check the [Rust Reference](https://doc.rust-lang.org/reference/conditional-compilation.html#target_os) for more details.
#[clippy::version = "1.45.0"]
pub MISMATCHED_TARGET_OS,
correctness,
"usage of `cfg(operating_system)` instead of `cfg(target_os = \"operating_system\")`"
}
declare_clippy_lint! {
/// ### What it does
/// Checks for attributes that allow lints without a reason.
@ -579,7 +545,6 @@ pub struct EarlyAttributes {
impl_lint_pass!(EarlyAttributes => [
DEPRECATED_CFG_ATTR,
MISMATCHED_TARGET_OS,
EMPTY_LINE_AFTER_OUTER_ATTR,
EMPTY_LINE_AFTER_DOC_COMMENTS,
NON_MINIMAL_CFG,
@ -595,7 +560,6 @@ impl EarlyLintPass for EarlyAttributes {
fn check_attribute(&mut self, cx: &EarlyContext<'_>, attr: &Attribute) {
deprecated_cfg_attr::check(cx, attr, &self.msrv);
deprecated_cfg_attr::check_clippy(cx, attr);
mismatched_target_os::check(cx, attr);
non_minimal_cfg::check(cx, attr);
}

View File

@ -58,7 +58,6 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
crate::attrs::EMPTY_LINE_AFTER_DOC_COMMENTS_INFO,
crate::attrs::EMPTY_LINE_AFTER_OUTER_ATTR_INFO,
crate::attrs::INLINE_ALWAYS_INFO,
crate::attrs::MISMATCHED_TARGET_OS_INFO,
crate::attrs::MIXED_ATTRIBUTES_STYLE_INFO,
crate::attrs::NON_MINIMAL_CFG_INFO,
crate::attrs::SHOULD_PANIC_WITHOUT_EXPECT_INFO,

View File

@ -228,3 +228,16 @@ declare_deprecated_lint! {
pub MAYBE_MISUSED_CFG,
"this lint has been replaced by `unexpected_cfgs`"
}
declare_deprecated_lint! {
/// ### What it does
/// Nothing. This lint has been deprecated.
///
/// ### Deprecation reason
/// This lint has been superseded by rustc's own [`unexpected_cfgs`] lint that is able to detect invalid `#[cfg(linux)]` attributes.
///
/// [`unexpected_cfgs`]: https://doc.rust-lang.org/rustc/lints/listing/warn-by-default.html#unexpected-cfgs
#[clippy::version = "1.80.0"]
pub MISMATCHED_TARGET_OS,
"this lint has been replaced by `unexpected_cfgs`"
}

View File

@ -71,4 +71,8 @@
"clippy::maybe_misused_cfg",
"this lint has been replaced by `unexpected_cfgs`",
);
store.register_removed(
"clippy::mismatched_target_os",
"this lint has been replaced by `unexpected_cfgs`",
);
}

View File

@ -19,5 +19,6 @@
#![warn(clippy::pub_enum_variant_names)]
#![warn(clippy::wrong_pub_self_convention)]
#![warn(clippy::maybe_misused_cfg)]
#![warn(clippy::mismatched_target_os)]
fn main() {}

View File

@ -103,5 +103,11 @@ error: lint `clippy::maybe_misused_cfg` has been removed: this lint has been rep
LL | #![warn(clippy::maybe_misused_cfg)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 17 previous errors
error: lint `clippy::mismatched_target_os` has been removed: this lint has been replaced by `unexpected_cfgs`
--> tests/ui/deprecated.rs:22:9
|
LL | #![warn(clippy::mismatched_target_os)]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
error: aborting due to 18 previous errors

View File

@ -1,25 +0,0 @@
#![warn(clippy::mismatched_target_os)]
#![allow(unused)]
#[cfg(target_os = "hermit")]
fn hermit() {}
#[cfg(target_os = "wasi")]
fn wasi() {}
#[cfg(target_os = "none")]
fn none() {}
// list with conditions
#[cfg(all(not(windows), target_os = "wasi"))]
fn list() {}
// windows is a valid target family, should be ignored
#[cfg(windows)]
fn windows() {}
// correct use, should be ignored
#[cfg(target_os = "hermit")]
fn correct() {}
fn main() {}

View File

@ -1,25 +0,0 @@
#![warn(clippy::mismatched_target_os)]
#![allow(unused)]
#[cfg(hermit)]
fn hermit() {}
#[cfg(wasi)]
fn wasi() {}
#[cfg(none)]
fn none() {}
// list with conditions
#[cfg(all(not(windows), wasi))]
fn list() {}
// windows is a valid target family, should be ignored
#[cfg(windows)]
fn windows() {}
// correct use, should be ignored
#[cfg(target_os = "hermit")]
fn correct() {}
fn main() {}

View File

@ -1,37 +0,0 @@
error: operating system used in target family position
--> tests/ui/mismatched_target_os_non_unix.rs:4:1
|
LL | #[cfg(hermit)]
| ^^^^^^------^^
| |
| help: try: `target_os = "hermit"`
|
= note: `-D clippy::mismatched-target-os` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::mismatched_target_os)]`
error: operating system used in target family position
--> tests/ui/mismatched_target_os_non_unix.rs:7:1
|
LL | #[cfg(wasi)]
| ^^^^^^----^^
| |
| help: try: `target_os = "wasi"`
error: operating system used in target family position
--> tests/ui/mismatched_target_os_non_unix.rs:10:1
|
LL | #[cfg(none)]
| ^^^^^^----^^
| |
| help: try: `target_os = "none"`
error: operating system used in target family position
--> tests/ui/mismatched_target_os_non_unix.rs:14:1
|
LL | #[cfg(all(not(windows), wasi))]
| ^^^^^^^^^^^^^^^^^^^^^^^^----^^^
| |
| help: try: `target_os = "wasi"`
error: aborting due to 4 previous errors

View File

@ -1,60 +0,0 @@
#![warn(clippy::mismatched_target_os)]
#![allow(unused)]
#[cfg(target_os = "linux")]
fn linux() {}
#[cfg(target_os = "freebsd")]
fn freebsd() {}
#[cfg(target_os = "dragonfly")]
fn dragonfly() {}
#[cfg(target_os = "openbsd")]
fn openbsd() {}
#[cfg(target_os = "netbsd")]
fn netbsd() {}
#[cfg(target_os = "macos")]
fn macos() {}
#[cfg(target_os = "ios")]
fn ios() {}
#[cfg(target_os = "android")]
fn android() {}
#[cfg(target_os = "emscripten")]
fn emscripten() {}
#[cfg(target_os = "fuchsia")]
fn fuchsia() {}
#[cfg(target_os = "haiku")]
fn haiku() {}
#[cfg(target_os = "illumos")]
fn illumos() {}
#[cfg(target_os = "l4re")]
fn l4re() {}
#[cfg(target_os = "redox")]
fn redox() {}
#[cfg(target_os = "solaris")]
fn solaris() {}
#[cfg(target_os = "vxworks")]
fn vxworks() {}
// list with conditions
#[cfg(all(not(any(target_os = "solaris", target_os = "linux")), target_os = "freebsd"))]
fn list() {}
// correct use, should be ignored
#[cfg(target_os = "freebsd")]
fn correct() {}
fn main() {}

View File

@ -1,60 +0,0 @@
#![warn(clippy::mismatched_target_os)]
#![allow(unused)]
#[cfg(linux)]
fn linux() {}
#[cfg(freebsd)]
fn freebsd() {}
#[cfg(dragonfly)]
fn dragonfly() {}
#[cfg(openbsd)]
fn openbsd() {}
#[cfg(netbsd)]
fn netbsd() {}
#[cfg(macos)]
fn macos() {}
#[cfg(ios)]
fn ios() {}
#[cfg(android)]
fn android() {}
#[cfg(emscripten)]
fn emscripten() {}
#[cfg(fuchsia)]
fn fuchsia() {}
#[cfg(haiku)]
fn haiku() {}
#[cfg(illumos)]
fn illumos() {}
#[cfg(l4re)]
fn l4re() {}
#[cfg(redox)]
fn redox() {}
#[cfg(solaris)]
fn solaris() {}
#[cfg(vxworks)]
fn vxworks() {}
// list with conditions
#[cfg(all(not(any(solaris, linux)), freebsd))]
fn list() {}
// correct use, should be ignored
#[cfg(target_os = "freebsd")]
fn correct() {}
fn main() {}

View File

@ -1,184 +0,0 @@
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:4:1
|
LL | #[cfg(linux)]
| ^^^^^^-----^^
| |
| help: try: `target_os = "linux"`
|
= help: did you mean `unix`?
= note: `-D clippy::mismatched-target-os` implied by `-D warnings`
= help: to override `-D warnings` add `#[allow(clippy::mismatched_target_os)]`
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:7:1
|
LL | #[cfg(freebsd)]
| ^^^^^^-------^^
| |
| help: try: `target_os = "freebsd"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:10:1
|
LL | #[cfg(dragonfly)]
| ^^^^^^---------^^
| |
| help: try: `target_os = "dragonfly"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:13:1
|
LL | #[cfg(openbsd)]
| ^^^^^^-------^^
| |
| help: try: `target_os = "openbsd"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:16:1
|
LL | #[cfg(netbsd)]
| ^^^^^^------^^
| |
| help: try: `target_os = "netbsd"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:19:1
|
LL | #[cfg(macos)]
| ^^^^^^-----^^
| |
| help: try: `target_os = "macos"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:22:1
|
LL | #[cfg(ios)]
| ^^^^^^---^^
| |
| help: try: `target_os = "ios"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:25:1
|
LL | #[cfg(android)]
| ^^^^^^-------^^
| |
| help: try: `target_os = "android"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:28:1
|
LL | #[cfg(emscripten)]
| ^^^^^^----------^^
| |
| help: try: `target_os = "emscripten"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:31:1
|
LL | #[cfg(fuchsia)]
| ^^^^^^-------^^
| |
| help: try: `target_os = "fuchsia"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:34:1
|
LL | #[cfg(haiku)]
| ^^^^^^-----^^
| |
| help: try: `target_os = "haiku"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:37:1
|
LL | #[cfg(illumos)]
| ^^^^^^-------^^
| |
| help: try: `target_os = "illumos"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:40:1
|
LL | #[cfg(l4re)]
| ^^^^^^----^^
| |
| help: try: `target_os = "l4re"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:43:1
|
LL | #[cfg(redox)]
| ^^^^^^-----^^
| |
| help: try: `target_os = "redox"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:46:1
|
LL | #[cfg(solaris)]
| ^^^^^^-------^^
| |
| help: try: `target_os = "solaris"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:49:1
|
LL | #[cfg(vxworks)]
| ^^^^^^-------^^
| |
| help: try: `target_os = "vxworks"`
|
= help: did you mean `unix`?
error: operating system used in target family position
--> tests/ui/mismatched_target_os_unix.rs:53:1
|
LL | #[cfg(all(not(any(solaris, linux)), freebsd))]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= help: did you mean `unix`?
help: try
|
LL | #[cfg(all(not(any(target_os = "solaris", linux)), freebsd))]
| ~~~~~~~~~~~~~~~~~~~~~
help: try
|
LL | #[cfg(all(not(any(solaris, target_os = "linux")), freebsd))]
| ~~~~~~~~~~~~~~~~~~~
help: try
|
LL | #[cfg(all(not(any(solaris, linux)), target_os = "freebsd"))]
| ~~~~~~~~~~~~~~~~~~~~~
error: aborting due to 17 previous errors