Skip to content

Commit d9c3f0d

Browse files
committed
Auto merge of #84039 - jyn514:uplift-atomic-ordering, r=wesleywiser
Uplift the invalid_atomic_ordering lint from clippy to rustc This is mostly just a rebase of rust-lang/rust#79654; I've copy/pasted the text from that PR below. r? `@lcnr` since you reviewed the last one, but feel free to reassign. --- This is an implementation of rust-lang/compiler-team#390. As mentioned, in general this turns an unconditional runtime panic into a (compile time) lint failure. It has no false positives, and the only false negatives I'm aware of are if `Ordering` isn't specified directly and is comes from an argument/constant/whatever. As a result of it having no false positives, and the alternative always being strictly wrong, it's on as deny by default. This seems right. In the [zulip stream](https://rust-lang.zulipchat.com/#narrow/stream/233931-t-compiler.2Fmajor-changes/topic/Uplift.20the.20.60invalid_atomic_ordering.60.20lint.20from.20clippy/near/218483957) `@joshtriplett` suggested that lang team should FCP this before landing it. Perhaps libs team cares too? --- Some notes on the code for reviewers / others below ## Changes from clippy The code is changed from [the implementation in clippy](https://github.com/rust-lang/rust-clippy/blob/68cf94f6a66e47234e3adefc6dfbe806cd6ad164/clippy_lints/src/atomic_ordering.rs) in the following ways: 1. Uses `Symbols` and `rustc_diagnostic_item`s instead of string literals. - It's possible I should have just invoked Symbol::intern for some of these instead? Seems better to use symbol, but it did require adding several. 2. The functions are moved to static methods inside the lint struct, as a way to namespace them. - There's a lot of other code in that file — which I picked as the location for this lint because `@jyn514` told me that seemed reasonable. 3. Supports unstable AtomicU128/AtomicI128. - I did this because it was almost easier to support them than not — not supporting them would have (ideally) required finding a way not to give them a `rustc_diagnostic_item`, which would have complicated an already big macro. - These don't have tests since I wasn't sure if/how I should make tests conditional on whether or not the target has the atomic... This is to a certain extent an issue of 64bit atomics too, but 128-bit atomics are much less common. Regardless, the existing tests should be *more* than thorough enough here. 4. Minor changes like: - grammar tweaks ("loads cannot have `Release` **and** `AcqRel` ordering" => "loads cannot have `Release` **or** `AcqRel` ordering") - function renames (`match_ordering_def_path` => `matches_ordering_def_path`), - avoiding clippy-specific helper methods that don't exist in rustc_lint and didn't seem worth adding for this case (for example `cx.struct_span_lint` vs clippy's `span_lint_and_help` helper). ## Potential issues (This is just about the code in this PR, not conceptual issues with the lint or anything) 1. I'm not sure if I should have used a diagnostic item for `Ordering` and its variants (I couldn't figure out how really, so if I should do this some pointers would be appreciated). - It seems possible that failing to do this might possibly mean there are more cases this lint would miss, but I don't really know how `match_def_path` works and if it has any pitfalls like that, so maybe not. 2. I *think* I deprecated the lint in clippy (CC `@flip1995` who asked to be notified about clippy changes in the future in [this comment](rust-lang/rust#75671 (comment))) but I'm not sure if I need to do anything else there. - I'm kind of hoping CI will catch if I missed anything, since `x.py test src/tools/clippy` fails with a lot of errors with and without my changes (and is probably a nonsense command regardless). Running `cargo test` from src/tools/clippy also fails with unrelated errors that seem like refactorings that didnt update clippy? So, honestly no clue. 3. I wasn't sure if the description/example I gave good. Hopefully it is. The example is less thorough than the one from clippy here: https://rust-lang.github.io/rust-clippy/master/index.html#invalid_atomic_ordering. Let me know if/how I should change it if it needs changing. 4. It pulls in the `if_chain` crate. This crate was already used in clippy, and seems like it's used elsewhere in rustc, but I'm willing to rewrite it to not use this if needed (I'd prefer not to, all things being equal).
2 parents b97d4c0 + 295225b commit d9c3f0d

20 files changed

+9
-1425
lines changed

clippy_lints/src/atomic_ordering.rs

-230
This file was deleted.

clippy_lints/src/lib.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,6 @@ mod asm_syntax;
165165
mod assertions_on_constants;
166166
mod assign_ops;
167167
mod async_yields_async;
168-
mod atomic_ordering;
169168
mod attrs;
170169
mod await_holding_invalid;
171170
mod bit_mask;
@@ -537,7 +536,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
537536
assign_ops::ASSIGN_OP_PATTERN,
538537
assign_ops::MISREFACTORED_ASSIGN_OP,
539538
async_yields_async::ASYNC_YIELDS_ASYNC,
540-
atomic_ordering::INVALID_ATOMIC_ORDERING,
541539
attrs::BLANKET_CLIPPY_RESTRICTION_LINTS,
542540
attrs::DEPRECATED_CFG_ATTR,
543541
attrs::DEPRECATED_SEMVER,
@@ -1175,7 +1173,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
11751173
LintId::of(assign_ops::ASSIGN_OP_PATTERN),
11761174
LintId::of(assign_ops::MISREFACTORED_ASSIGN_OP),
11771175
LintId::of(async_yields_async::ASYNC_YIELDS_ASYNC),
1178-
LintId::of(atomic_ordering::INVALID_ATOMIC_ORDERING),
11791176
LintId::of(attrs::BLANKET_CLIPPY_RESTRICTION_LINTS),
11801177
LintId::of(attrs::DEPRECATED_CFG_ATTR),
11811178
LintId::of(attrs::DEPRECATED_SEMVER),
@@ -1673,7 +1670,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
16731670
LintId::of(absurd_extreme_comparisons::ABSURD_EXTREME_COMPARISONS),
16741671
LintId::of(approx_const::APPROX_CONSTANT),
16751672
LintId::of(async_yields_async::ASYNC_YIELDS_ASYNC),
1676-
LintId::of(atomic_ordering::INVALID_ATOMIC_ORDERING),
16771673
LintId::of(attrs::DEPRECATED_SEMVER),
16781674
LintId::of(attrs::MISMATCHED_TARGET_OS),
16791675
LintId::of(attrs::USELESS_ATTRIBUTE),
@@ -2047,7 +2043,6 @@ pub fn register_plugins(store: &mut rustc_lint::LintStore, sess: &Session, conf:
20472043
store.register_late_pass(|| box floating_point_arithmetic::FloatingPointArithmetic);
20482044
store.register_early_pass(|| box as_conversions::AsConversions);
20492045
store.register_late_pass(|| box let_underscore::LetUnderscore);
2050-
store.register_late_pass(|| box atomic_ordering::AtomicOrdering);
20512046
store.register_early_pass(|| box single_component_path_imports::SingleComponentPathImports);
20522047
let max_fn_params_bools = conf.max_fn_params_bools;
20532048
let max_struct_bools = conf.max_struct_bools;
@@ -2186,6 +2181,7 @@ pub fn register_renamed(ls: &mut rustc_lint::LintStore) {
21862181
ls.register_renamed("clippy::temporary_cstring_as_ptr", "temporary_cstring_as_ptr");
21872182
ls.register_renamed("clippy::panic_params", "non_fmt_panics");
21882183
ls.register_renamed("clippy::unknown_clippy_lints", "unknown_lints");
2184+
ls.register_renamed("clippy::invalid_atomic_ordering", "invalid_atomic_ordering");
21892185
}
21902186

21912187
// only exists to let the dogfood integration test works.

tests/ui/atomic_ordering_bool.rs

-25
This file was deleted.

tests/ui/atomic_ordering_bool.stderr

-35
This file was deleted.

tests/ui/atomic_ordering_exchange.rs

-45
This file was deleted.

0 commit comments

Comments
 (0)