Thanks to visit codestin.com
Credit goes to github.com

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 rust-lang#98383.
1 parent 8804161 commit 45afc21

8 files changed

+60
-297
lines changed

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

Lines changed: 0 additions & 5 deletions
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

Lines changed: 3 additions & 38 deletions
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

Lines changed: 8 additions & 20 deletions
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
}
Lines changed: 11 additions & 65 deletions
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

Lines changed: 8 additions & 20 deletions
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)