Skip to content

Commit a97e2d3

Browse files
committed
invalid_atomic_ordering: also lint update & try_update
1 parent c5e283b commit a97e2d3

File tree

4 files changed

+277
-15
lines changed

4 files changed

+277
-15
lines changed

compiler/rustc_lint/src/types.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,7 +1022,8 @@ declare_lint! {
10221022
///
10231023
/// - Passing `Ordering::Release` or `Ordering::AcqRel` as the failure
10241024
/// ordering for any of `AtomicType::compare_exchange`,
1025-
/// `AtomicType::compare_exchange_weak`, or `AtomicType::fetch_update`.
1025+
/// `AtomicType::compare_exchange_weak`, `AtomicType::update`, or
1026+
/// `AtomicType::try_update`.
10261027
INVALID_ATOMIC_ORDERING,
10271028
Deny,
10281029
"usage of invalid atomic ordering in atomic operations and memory fences"
@@ -1118,13 +1119,19 @@ impl InvalidAtomicOrdering {
11181119
let Some((method, args)) = Self::inherent_atomic_method_call(
11191120
cx,
11201121
expr,
1121-
&[sym::fetch_update, sym::compare_exchange, sym::compare_exchange_weak],
1122+
&[
1123+
sym::update,
1124+
sym::try_update,
1125+
sym::fetch_update,
1126+
sym::compare_exchange,
1127+
sym::compare_exchange_weak,
1128+
],
11221129
) else {
11231130
return;
11241131
};
11251132

11261133
let fail_order_arg = match method {
1127-
sym::fetch_update => &args[1],
1134+
sym::update | sym::try_update | sym::fetch_update => &args[1],
11281135
sym::compare_exchange | sym::compare_exchange_weak => &args[3],
11291136
_ => return,
11301137
};

compiler/rustc_span/src/symbol.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2273,6 +2273,7 @@ symbols! {
22732273
try_from_fn,
22742274
try_into,
22752275
try_trait_v2,
2276+
try_update,
22762277
tt,
22772278
tuple,
22782279
tuple_indexing,
@@ -2390,6 +2391,7 @@ symbols! {
23902391
unwrap,
23912392
unwrap_binder,
23922393
unwrap_or,
2394+
update,
23932395
use_cloned,
23942396
use_extern_macros,
23952397
use_nested_groups,

tests/ui/lint/lint-invalid-atomic-ordering-fetch-update.rs

Lines changed: 94 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,43 +7,136 @@ fn main() {
77

88
// Allowed ordering combos
99
let _ = x.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |old| Some(old + 1));
10+
let _ = x.try_update(Ordering::Relaxed, Ordering::Relaxed, |old| Some(old + 1));
11+
let _ = x.update(Ordering::Relaxed, Ordering::Relaxed, |old| old + 1);
12+
1013
let _ = x.fetch_update(Ordering::Relaxed, Ordering::Acquire, |old| Some(old + 1));
14+
let _ = x.try_update(Ordering::Relaxed, Ordering::Acquire, |old| Some(old + 1));
15+
let _ = x.update(Ordering::Relaxed, Ordering::Acquire, |old| old + 1);
16+
1117
let _ = x.fetch_update(Ordering::Relaxed, Ordering::SeqCst, |old| Some(old + 1));
18+
let _ = x.try_update(Ordering::Relaxed, Ordering::SeqCst, |old| Some(old + 1));
19+
let _ = x.update(Ordering::Relaxed, Ordering::SeqCst, |old| old + 1);
20+
1221
let _ = x.fetch_update(Ordering::Acquire, Ordering::Relaxed, |old| Some(old + 1));
22+
let _ = x.try_update(Ordering::Acquire, Ordering::Relaxed, |old| Some(old + 1));
23+
let _ = x.update(Ordering::Acquire, Ordering::Relaxed, |old| old + 1);
24+
1325
let _ = x.fetch_update(Ordering::Acquire, Ordering::Acquire, |old| Some(old + 1));
26+
let _ = x.try_update(Ordering::Acquire, Ordering::Acquire, |old| Some(old + 1));
27+
let _ = x.update(Ordering::Acquire, Ordering::Acquire, |old| old + 1);
28+
1429
let _ = x.fetch_update(Ordering::Acquire, Ordering::SeqCst, |old| Some(old + 1));
30+
let _ = x.try_update(Ordering::Acquire, Ordering::SeqCst, |old| Some(old + 1));
31+
let _ = x.update(Ordering::Acquire, Ordering::SeqCst, |old| old + 1);
32+
1533
let _ = x.fetch_update(Ordering::Release, Ordering::Relaxed, |old| Some(old + 1));
34+
let _ = x.try_update(Ordering::Release, Ordering::Relaxed, |old| Some(old + 1));
35+
let _ = x.update(Ordering::Release, Ordering::Relaxed, |old| old + 1);
36+
1637
let _ = x.fetch_update(Ordering::Release, Ordering::Acquire, |old| Some(old + 1));
38+
let _ = x.try_update(Ordering::Release, Ordering::Acquire, |old| Some(old + 1));
39+
let _ = x.update(Ordering::Release, Ordering::Acquire, |old| old + 1);
40+
1741
let _ = x.fetch_update(Ordering::Release, Ordering::SeqCst, |old| Some(old + 1));
42+
let _ = x.try_update(Ordering::Release, Ordering::SeqCst, |old| Some(old + 1));
43+
let _ = x.update(Ordering::Release, Ordering::SeqCst, |old| old + 1);
44+
1845
let _ = x.fetch_update(Ordering::AcqRel, Ordering::Relaxed, |old| Some(old + 1));
46+
let _ = x.try_update(Ordering::AcqRel, Ordering::Relaxed, |old| Some(old + 1));
47+
let _ = x.update(Ordering::AcqRel, Ordering::Relaxed, |old| old + 1);
48+
1949
let _ = x.fetch_update(Ordering::AcqRel, Ordering::Acquire, |old| Some(old + 1));
50+
let _ = x.try_update(Ordering::AcqRel, Ordering::Acquire, |old| Some(old + 1));
51+
let _ = x.update(Ordering::AcqRel, Ordering::Acquire, |old| old + 1);
52+
2053
let _ = x.fetch_update(Ordering::AcqRel, Ordering::SeqCst, |old| Some(old + 1));
54+
let _ = x.try_update(Ordering::AcqRel, Ordering::SeqCst, |old| Some(old + 1));
55+
let _ = x.update(Ordering::AcqRel, Ordering::SeqCst, |old| old + 1);
56+
2157
let _ = x.fetch_update(Ordering::SeqCst, Ordering::Relaxed, |old| Some(old + 1));
58+
let _ = x.try_update(Ordering::SeqCst, Ordering::Relaxed, |old| Some(old + 1));
59+
let _ = x.update(Ordering::SeqCst, Ordering::Relaxed, |old| old + 1);
60+
2261
let _ = x.fetch_update(Ordering::SeqCst, Ordering::Acquire, |old| Some(old + 1));
62+
let _ = x.try_update(Ordering::SeqCst, Ordering::Acquire, |old| Some(old + 1));
63+
let _ = x.update(Ordering::SeqCst, Ordering::Acquire, |old| old + 1);
64+
2365
let _ = x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |old| Some(old + 1));
66+
let _ = x.try_update(Ordering::SeqCst, Ordering::SeqCst, |old| Some(old + 1));
67+
let _ = x.update(Ordering::SeqCst, Ordering::SeqCst, |old| old + 1);
2468

2569
// AcqRel is always forbidden as a failure ordering
70+
2671
let _ = x.fetch_update(Ordering::Relaxed, Ordering::AcqRel, |old| Some(old + 1));
2772
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
73+
let _ = x.try_update(Ordering::Relaxed, Ordering::AcqRel, |old| Some(old + 1));
74+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
75+
let _ = x.update(Ordering::Relaxed, Ordering::AcqRel, |old| old + 1);
76+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
77+
2878
let _ = x.fetch_update(Ordering::Acquire, Ordering::AcqRel, |old| Some(old + 1));
2979
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
80+
let _ = x.try_update(Ordering::Acquire, Ordering::AcqRel, |old| Some(old + 1));
81+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
82+
let _ = x.update(Ordering::Acquire, Ordering::AcqRel, |old| old + 1);
83+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
84+
3085
let _ = x.fetch_update(Ordering::Release, Ordering::AcqRel, |old| Some(old + 1));
3186
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
87+
let _ = x.try_update(Ordering::Release, Ordering::AcqRel, |old| Some(old + 1));
88+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
89+
let _ = x.update(Ordering::Release, Ordering::AcqRel, |old| old + 1);
90+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
91+
3292
let _ = x.fetch_update(Ordering::AcqRel, Ordering::AcqRel, |old| Some(old + 1));
3393
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
94+
let _ = x.try_update(Ordering::AcqRel, Ordering::AcqRel, |old| Some(old + 1));
95+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
96+
let _ = x.update(Ordering::AcqRel, Ordering::AcqRel, |old| old + 1);
97+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
98+
3499
let _ = x.fetch_update(Ordering::SeqCst, Ordering::AcqRel, |old| Some(old + 1));
35100
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
101+
let _ = x.try_update(Ordering::SeqCst, Ordering::AcqRel, |old| Some(old + 1));
102+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
103+
let _ = x.update(Ordering::SeqCst, Ordering::AcqRel, |old| old + 1);
104+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
36105

37106
// Release is always forbidden as a failure ordering
107+
38108
let _ = x.fetch_update(Ordering::Relaxed, Ordering::Release, |old| Some(old + 1));
39109
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
110+
let _ = x.try_update(Ordering::Relaxed, Ordering::Release, |old| Some(old + 1));
111+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
112+
let _ = x.update(Ordering::Relaxed, Ordering::Release, |old| old + 1);
113+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
114+
40115
let _ = x.fetch_update(Ordering::Acquire, Ordering::Release, |old| Some(old + 1));
41116
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
117+
let _ = x.try_update(Ordering::Acquire, Ordering::Release, |old| Some(old + 1));
118+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
119+
let _ = x.update(Ordering::Acquire, Ordering::Release, |old| old + 1);
120+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
121+
42122
let _ = x.fetch_update(Ordering::Release, Ordering::Release, |old| Some(old + 1));
43123
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
124+
let _ = x.try_update(Ordering::Release, Ordering::Release, |old| Some(old + 1));
125+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
126+
let _ = x.update(Ordering::Release, Ordering::Release, |old| old + 1);
127+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
128+
44129
let _ = x.fetch_update(Ordering::AcqRel, Ordering::Release, |old| Some(old + 1));
45130
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
131+
let _ = x.try_update(Ordering::AcqRel, Ordering::Release, |old| Some(old + 1));
132+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
133+
let _ = x.update(Ordering::AcqRel, Ordering::Release, |old| old + 1);
134+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
135+
46136
let _ = x.fetch_update(Ordering::SeqCst, Ordering::Release, |old| Some(old + 1));
47137
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
48-
138+
let _ = x.try_update(Ordering::SeqCst, Ordering::Release, |old| Some(old + 1));
139+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
140+
let _ = x.update(Ordering::SeqCst, Ordering::Release, |old| old + 1);
141+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
49142
}

0 commit comments

Comments
 (0)