Skip to content

Commit 45afc21

Browse files
committed
Update invalid atomic ordering lint
The restriction that success ordering must be at least as strong as its failure ordering in compare-exchange operations was lifted in #98383.
1 parent 8804161 commit 45afc21

8 files changed

+60
-297
lines changed

compiler/rustc_error_messages/locales/en-US/lint.ftl

-5
Original file line numberDiff line numberDiff line change
@@ -247,11 +247,6 @@ lint-atomic-ordering-invalid = `{$method}`'s failure ordering may not be `Releas
247247
.label = invalid failure ordering
248248
.help = consider using `Acquire` or `Relaxed` failure ordering instead
249249
250-
lint-atomic-ordering-invalid-fail-success = `{$method}`'s success ordering must be at least as strong as its failure ordering
251-
.fail-label = `{$fail_ordering}` failure ordering
252-
.success-label = `{$success_ordering}` success ordering
253-
.suggestion = consider using `{$success_suggestion}` success ordering instead
254-
255250
lint-unused-op = unused {$op} that must be used
256251
.label = the {$op} produces a value
257252
.suggestion = use `let _ = ...` to ignore the resulting value

compiler/rustc_lint/src/types.rs

+3-38
Original file line numberDiff line numberDiff line change
@@ -1434,10 +1434,6 @@ declare_lint! {
14341434
/// - Passing `Ordering::Release` or `Ordering::AcqRel` as the failure
14351435
/// ordering for any of `AtomicType::compare_exchange`,
14361436
/// `AtomicType::compare_exchange_weak`, or `AtomicType::fetch_update`.
1437-
///
1438-
/// - Passing in a pair of orderings to `AtomicType::compare_exchange`,
1439-
/// `AtomicType::compare_exchange_weak`, or `AtomicType::fetch_update`
1440-
/// where the failure ordering is stronger than the success ordering.
14411437
INVALID_ATOMIC_ORDERING,
14421438
Deny,
14431439
"usage of invalid atomic ordering in atomic operations and memory fences"
@@ -1544,9 +1540,9 @@ impl InvalidAtomicOrdering {
15441540
let Some((method, args)) = Self::inherent_atomic_method_call(cx, expr, &[sym::fetch_update, sym::compare_exchange, sym::compare_exchange_weak])
15451541
else {return };
15461542

1547-
let (success_order_arg, fail_order_arg) = match method {
1548-
sym::fetch_update => (&args[1], &args[2]),
1549-
sym::compare_exchange | sym::compare_exchange_weak => (&args[3], &args[4]),
1543+
let fail_order_arg = match method {
1544+
sym::fetch_update => &args[2],
1545+
sym::compare_exchange | sym::compare_exchange_weak => &args[4],
15501546
_ => return,
15511547
};
15521548

@@ -1568,37 +1564,6 @@ impl InvalidAtomicOrdering {
15681564
InvalidAtomicOrderingDiag { method, fail_order_arg_span: fail_order_arg.span },
15691565
);
15701566
}
1571-
1572-
let Some(success_ordering) = Self::match_ordering(cx, success_order_arg) else { return };
1573-
1574-
if matches!(
1575-
(success_ordering, fail_ordering),
1576-
(sym::Relaxed | sym::Release, sym::Acquire)
1577-
| (sym::Relaxed | sym::Release | sym::Acquire | sym::AcqRel, sym::SeqCst)
1578-
) {
1579-
let success_suggestion =
1580-
if success_ordering == sym::Release && fail_ordering == sym::Acquire {
1581-
sym::AcqRel
1582-
} else {
1583-
fail_ordering
1584-
};
1585-
cx.struct_span_lint(INVALID_ATOMIC_ORDERING, success_order_arg.span, |diag| {
1586-
diag.build(fluent::lint::atomic_ordering_invalid_fail_success)
1587-
.set_arg("method", method)
1588-
.set_arg("fail_ordering", fail_ordering)
1589-
.set_arg("success_ordering", success_ordering)
1590-
.set_arg("success_suggestion", success_suggestion)
1591-
.span_label(fail_order_arg.span, fluent::lint::fail_label)
1592-
.span_label(success_order_arg.span, fluent::lint::success_label)
1593-
.span_suggestion_short(
1594-
success_order_arg.span,
1595-
fluent::lint::suggestion,
1596-
format!("std::sync::atomic::Ordering::{success_suggestion}"),
1597-
Applicability::MaybeIncorrect,
1598-
)
1599-
.emit();
1600-
});
1601-
}
16021567
}
16031568
}
16041569

src/test/ui/lint/lint-invalid-atomic-ordering-exchange-weak.rs

+8-20
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,17 @@ fn main() {
99

1010
// Allowed ordering combos
1111
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Relaxed);
12-
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Acquire);
12+
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Acquire);
13+
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::SeqCst);
1314
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Relaxed);
15+
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Acquire);
16+
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::SeqCst);
1417
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Release, Ordering::Relaxed);
15-
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Acquire);
18+
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::Acquire);
19+
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::SeqCst);
1620
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Relaxed);
21+
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Acquire);
22+
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::SeqCst);
1723
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Relaxed);
1824
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Acquire);
1925
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::SeqCst);
@@ -41,22 +47,4 @@ fn main() {
4147
//~^ ERROR `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`
4248
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Release);
4349
//~^ ERROR `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`
44-
45-
// Release success order forbids failure order of Acquire or SeqCst
46-
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::Acquire);
47-
//~^ ERROR `compare_exchange_weak`'s success ordering must be at least as strong as
48-
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::SeqCst);
49-
//~^ ERROR `compare_exchange_weak`'s success ordering must be at least as strong as
50-
51-
// Relaxed success order also forbids failure order of Acquire or SeqCst
52-
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::SeqCst);
53-
//~^ ERROR `compare_exchange_weak`'s success ordering must be at least as strong as
54-
let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Acquire);
55-
//~^ ERROR `compare_exchange_weak`'s success ordering must be at least as strong as
56-
57-
// Acquire/AcqRel forbids failure order of SeqCst
58-
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::SeqCst);
59-
//~^ ERROR `compare_exchange_weak`'s success ordering must be at least as strong as
60-
let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::SeqCst);
61-
//~^ ERROR `compare_exchange_weak`'s success ordering must be at least as strong as
6250
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
2-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:22:67
2+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:28:67
33
|
44
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Relaxed, Ordering::AcqRel);
55
| ^^^^^^^^^^^^^^^^ invalid failure ordering
@@ -8,130 +8,76 @@ LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Relaxed, Ordering:
88
= help: consider using `Acquire` or `Relaxed` failure ordering instead
99

1010
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
11-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:24:67
11+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:30:67
1212
|
1313
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::AcqRel);
1414
| ^^^^^^^^^^^^^^^^ invalid failure ordering
1515
|
1616
= help: consider using `Acquire` or `Relaxed` failure ordering instead
1717

1818
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
19-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:26:67
19+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:32:67
2020
|
2121
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::AcqRel);
2222
| ^^^^^^^^^^^^^^^^ invalid failure ordering
2323
|
2424
= help: consider using `Acquire` or `Relaxed` failure ordering instead
2525

2626
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
27-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:28:66
27+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:34:66
2828
|
2929
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::AcqRel);
3030
| ^^^^^^^^^^^^^^^^ invalid failure ordering
3131
|
3232
= help: consider using `Acquire` or `Relaxed` failure ordering instead
3333

3434
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
35-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:30:66
35+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:36:66
3636
|
3737
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::SeqCst, Ordering::AcqRel);
3838
| ^^^^^^^^^^^^^^^^ invalid failure ordering
3939
|
4040
= help: consider using `Acquire` or `Relaxed` failure ordering instead
4141

4242
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
43-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:34:67
43+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:40:67
4444
|
4545
LL | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Release);
4646
| ^^^^^^^^^^^^^^^^^ invalid failure ordering
4747
|
4848
= help: consider using `Acquire` or `Relaxed` failure ordering instead
4949

5050
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
51-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:36:67
51+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:42:67
5252
|
5353
LL | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Acquire, Ordering::Release);
5454
| ^^^^^^^^^^^^^^^^^ invalid failure ordering
5555
|
5656
= help: consider using `Acquire` or `Relaxed` failure ordering instead
5757

5858
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
59-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:38:67
59+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:44:67
6060
|
6161
LL | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Release, Ordering::Release);
6262
| ^^^^^^^^^^^^^^^^^ invalid failure ordering
6363
|
6464
= help: consider using `Acquire` or `Relaxed` failure ordering instead
6565

6666
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
67-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:40:66
67+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:46:66
6868
|
6969
LL | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::AcqRel, Ordering::Release);
7070
| ^^^^^^^^^^^^^^^^^ invalid failure ordering
7171
|
7272
= help: consider using `Acquire` or `Relaxed` failure ordering instead
7373

7474
error: `compare_exchange_weak`'s failure ordering may not be `Release` or `AcqRel`, since a failed `compare_exchange_weak` does not result in a write
75-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:42:66
75+
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:48:66
7676
|
7777
LL | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::SeqCst, Ordering::Release);
7878
| ^^^^^^^^^^^^^^^^^ invalid failure ordering
7979
|
8080
= help: consider using `Acquire` or `Relaxed` failure ordering instead
8181

82-
error: `compare_exchange_weak`'s success ordering must be at least as strong as its failure ordering
83-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:46:48
84-
|
85-
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::Acquire);
86-
| ^^^^^^^^^^^^^^^^^ ----------------- `Acquire` failure ordering
87-
| |
88-
| `Release` success ordering
89-
| help: consider using `AcqRel` success ordering instead
90-
91-
error: `compare_exchange_weak`'s success ordering must be at least as strong as its failure ordering
92-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:48:48
93-
|
94-
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Release, Ordering::SeqCst);
95-
| ^^^^^^^^^^^^^^^^^ ---------------- `SeqCst` failure ordering
96-
| |
97-
| `Release` success ordering
98-
| help: consider using `SeqCst` success ordering instead
99-
100-
error: `compare_exchange_weak`'s success ordering must be at least as strong as its failure ordering
101-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:52:48
102-
|
103-
LL | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::SeqCst);
104-
| ^^^^^^^^^^^^^^^^^ ---------------- `SeqCst` failure ordering
105-
| |
106-
| `Relaxed` success ordering
107-
| help: consider using `SeqCst` success ordering instead
108-
109-
error: `compare_exchange_weak`'s success ordering must be at least as strong as its failure ordering
110-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:54:48
111-
|
112-
LL | let _ = x.compare_exchange_weak(ptr, ptr2, Ordering::Relaxed, Ordering::Acquire);
113-
| ^^^^^^^^^^^^^^^^^ ----------------- `Acquire` failure ordering
114-
| |
115-
| `Relaxed` success ordering
116-
| help: consider using `Acquire` success ordering instead
117-
118-
error: `compare_exchange_weak`'s success ordering must be at least as strong as its failure ordering
119-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:58:48
120-
|
121-
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::Acquire, Ordering::SeqCst);
122-
| ^^^^^^^^^^^^^^^^^ ---------------- `SeqCst` failure ordering
123-
| |
124-
| `Acquire` success ordering
125-
| help: consider using `SeqCst` success ordering instead
126-
127-
error: `compare_exchange_weak`'s success ordering must be at least as strong as its failure ordering
128-
--> $DIR/lint-invalid-atomic-ordering-exchange-weak.rs:60:48
129-
|
130-
LL | let _ = x.compare_exchange_weak(ptr2, ptr, Ordering::AcqRel, Ordering::SeqCst);
131-
| ^^^^^^^^^^^^^^^^ ---------------- `SeqCst` failure ordering
132-
| |
133-
| `AcqRel` success ordering
134-
| help: consider using `SeqCst` success ordering instead
135-
136-
error: aborting due to 16 previous errors
82+
error: aborting due to 10 previous errors
13783

src/test/ui/lint/lint-invalid-atomic-ordering-exchange.rs

+8-20
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@ fn main() {
77

88
// Allowed ordering combos
99
let _ = x.compare_exchange(0, 0, Ordering::Relaxed, Ordering::Relaxed);
10-
let _ = x.compare_exchange(0, 0, Ordering::Acquire, Ordering::Acquire);
10+
let _ = x.compare_exchange(0, 0, Ordering::Relaxed, Ordering::Acquire);
11+
let _ = x.compare_exchange(0, 0, Ordering::Relaxed, Ordering::SeqCst);
1112
let _ = x.compare_exchange(0, 0, Ordering::Acquire, Ordering::Relaxed);
13+
let _ = x.compare_exchange(0, 0, Ordering::Acquire, Ordering::Acquire);
14+
let _ = x.compare_exchange(0, 0, Ordering::Acquire, Ordering::SeqCst);
1215
let _ = x.compare_exchange(0, 0, Ordering::Release, Ordering::Relaxed);
13-
let _ = x.compare_exchange(0, 0, Ordering::AcqRel, Ordering::Acquire);
16+
let _ = x.compare_exchange(0, 0, Ordering::Release, Ordering::Acquire);
17+
let _ = x.compare_exchange(0, 0, Ordering::Release, Ordering::SeqCst);
1418
let _ = x.compare_exchange(0, 0, Ordering::AcqRel, Ordering::Relaxed);
19+
let _ = x.compare_exchange(0, 0, Ordering::AcqRel, Ordering::Acquire);
20+
let _ = x.compare_exchange(0, 0, Ordering::AcqRel, Ordering::SeqCst);
1521
let _ = x.compare_exchange(0, 0, Ordering::SeqCst, Ordering::Relaxed);
1622
let _ = x.compare_exchange(0, 0, Ordering::SeqCst, Ordering::Acquire);
1723
let _ = x.compare_exchange(0, 0, Ordering::SeqCst, Ordering::SeqCst);
@@ -39,22 +45,4 @@ fn main() {
3945
//~^ ERROR `compare_exchange`'s failure ordering may not be `Release` or `AcqRel`
4046
let _ = x.compare_exchange(0, 0, Ordering::SeqCst, Ordering::Release);
4147
//~^ ERROR `compare_exchange`'s failure ordering may not be `Release` or `AcqRel`
42-
43-
// Release success order forbids failure order of Acquire or SeqCst
44-
let _ = x.compare_exchange(0, 0, Ordering::Release, Ordering::Acquire);
45-
//~^ ERROR `compare_exchange`'s success ordering must be at least as strong as
46-
let _ = x.compare_exchange(0, 0, Ordering::Release, Ordering::SeqCst);
47-
//~^ ERROR `compare_exchange`'s success ordering must be at least as strong as
48-
49-
// Relaxed success order also forbids failure order of Acquire or SeqCst
50-
let _ = x.compare_exchange(0, 0, Ordering::Relaxed, Ordering::SeqCst);
51-
//~^ ERROR `compare_exchange`'s success ordering must be at least as strong as
52-
let _ = x.compare_exchange(0, 0, Ordering::Relaxed, Ordering::Acquire);
53-
//~^ ERROR `compare_exchange`'s success ordering must be at least as strong as
54-
55-
// Acquire/AcqRel forbids failure order of SeqCst
56-
let _ = x.compare_exchange(0, 0, Ordering::Acquire, Ordering::SeqCst);
57-
//~^ ERROR `compare_exchange`'s success ordering must be at least as strong as
58-
let _ = x.compare_exchange(0, 0, Ordering::AcqRel, Ordering::SeqCst);
59-
//~^ ERROR `compare_exchange`'s success ordering must be at least as strong as
6048
}

0 commit comments

Comments
 (0)