Skip to content

Commit fbac049

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

File tree

4 files changed

+279
-15
lines changed

4 files changed

+279
-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,
Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
//@ only-x86_64
2+
#![feature(atomic_try_update)]
3+
24
use std::sync::atomic::{AtomicIsize, Ordering};
35

46
fn main() {
@@ -7,43 +9,136 @@ fn main() {
79

810
// Allowed ordering combos
911
let _ = x.fetch_update(Ordering::Relaxed, Ordering::Relaxed, |old| Some(old + 1));
12+
let _ = x.try_update(Ordering::Relaxed, Ordering::Relaxed, |old| Some(old + 1));
13+
let _ = x.update(Ordering::Relaxed, Ordering::Relaxed, |old| old + 1);
14+
1015
let _ = x.fetch_update(Ordering::Relaxed, Ordering::Acquire, |old| Some(old + 1));
16+
let _ = x.try_update(Ordering::Relaxed, Ordering::Acquire, |old| Some(old + 1));
17+
let _ = x.update(Ordering::Relaxed, Ordering::Acquire, |old| old + 1);
18+
1119
let _ = x.fetch_update(Ordering::Relaxed, Ordering::SeqCst, |old| Some(old + 1));
20+
let _ = x.try_update(Ordering::Relaxed, Ordering::SeqCst, |old| Some(old + 1));
21+
let _ = x.update(Ordering::Relaxed, Ordering::SeqCst, |old| old + 1);
22+
1223
let _ = x.fetch_update(Ordering::Acquire, Ordering::Relaxed, |old| Some(old + 1));
24+
let _ = x.try_update(Ordering::Acquire, Ordering::Relaxed, |old| Some(old + 1));
25+
let _ = x.update(Ordering::Acquire, Ordering::Relaxed, |old| old + 1);
26+
1327
let _ = x.fetch_update(Ordering::Acquire, Ordering::Acquire, |old| Some(old + 1));
28+
let _ = x.try_update(Ordering::Acquire, Ordering::Acquire, |old| Some(old + 1));
29+
let _ = x.update(Ordering::Acquire, Ordering::Acquire, |old| old + 1);
30+
1431
let _ = x.fetch_update(Ordering::Acquire, Ordering::SeqCst, |old| Some(old + 1));
32+
let _ = x.try_update(Ordering::Acquire, Ordering::SeqCst, |old| Some(old + 1));
33+
let _ = x.update(Ordering::Acquire, Ordering::SeqCst, |old| old + 1);
34+
1535
let _ = x.fetch_update(Ordering::Release, Ordering::Relaxed, |old| Some(old + 1));
36+
let _ = x.try_update(Ordering::Release, Ordering::Relaxed, |old| Some(old + 1));
37+
let _ = x.update(Ordering::Release, Ordering::Relaxed, |old| old + 1);
38+
1639
let _ = x.fetch_update(Ordering::Release, Ordering::Acquire, |old| Some(old + 1));
40+
let _ = x.try_update(Ordering::Release, Ordering::Acquire, |old| Some(old + 1));
41+
let _ = x.update(Ordering::Release, Ordering::Acquire, |old| old + 1);
42+
1743
let _ = x.fetch_update(Ordering::Release, Ordering::SeqCst, |old| Some(old + 1));
44+
let _ = x.try_update(Ordering::Release, Ordering::SeqCst, |old| Some(old + 1));
45+
let _ = x.update(Ordering::Release, Ordering::SeqCst, |old| old + 1);
46+
1847
let _ = x.fetch_update(Ordering::AcqRel, Ordering::Relaxed, |old| Some(old + 1));
48+
let _ = x.try_update(Ordering::AcqRel, Ordering::Relaxed, |old| Some(old + 1));
49+
let _ = x.update(Ordering::AcqRel, Ordering::Relaxed, |old| old + 1);
50+
1951
let _ = x.fetch_update(Ordering::AcqRel, Ordering::Acquire, |old| Some(old + 1));
52+
let _ = x.try_update(Ordering::AcqRel, Ordering::Acquire, |old| Some(old + 1));
53+
let _ = x.update(Ordering::AcqRel, Ordering::Acquire, |old| old + 1);
54+
2055
let _ = x.fetch_update(Ordering::AcqRel, Ordering::SeqCst, |old| Some(old + 1));
56+
let _ = x.try_update(Ordering::AcqRel, Ordering::SeqCst, |old| Some(old + 1));
57+
let _ = x.update(Ordering::AcqRel, Ordering::SeqCst, |old| old + 1);
58+
2159
let _ = x.fetch_update(Ordering::SeqCst, Ordering::Relaxed, |old| Some(old + 1));
60+
let _ = x.try_update(Ordering::SeqCst, Ordering::Relaxed, |old| Some(old + 1));
61+
let _ = x.update(Ordering::SeqCst, Ordering::Relaxed, |old| old + 1);
62+
2263
let _ = x.fetch_update(Ordering::SeqCst, Ordering::Acquire, |old| Some(old + 1));
64+
let _ = x.try_update(Ordering::SeqCst, Ordering::Acquire, |old| Some(old + 1));
65+
let _ = x.update(Ordering::SeqCst, Ordering::Acquire, |old| old + 1);
66+
2367
let _ = x.fetch_update(Ordering::SeqCst, Ordering::SeqCst, |old| Some(old + 1));
68+
let _ = x.try_update(Ordering::SeqCst, Ordering::SeqCst, |old| Some(old + 1));
69+
let _ = x.update(Ordering::SeqCst, Ordering::SeqCst, |old| old + 1);
2470

2571
// AcqRel is always forbidden as a failure ordering
72+
2673
let _ = x.fetch_update(Ordering::Relaxed, Ordering::AcqRel, |old| Some(old + 1));
2774
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
75+
let _ = x.try_update(Ordering::Relaxed, Ordering::AcqRel, |old| Some(old + 1));
76+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
77+
let _ = x.update(Ordering::Relaxed, Ordering::AcqRel, |old| old + 1);
78+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
79+
2880
let _ = x.fetch_update(Ordering::Acquire, Ordering::AcqRel, |old| Some(old + 1));
2981
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
82+
let _ = x.try_update(Ordering::Acquire, Ordering::AcqRel, |old| Some(old + 1));
83+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
84+
let _ = x.update(Ordering::Acquire, Ordering::AcqRel, |old| old + 1);
85+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
86+
3087
let _ = x.fetch_update(Ordering::Release, Ordering::AcqRel, |old| Some(old + 1));
3188
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
89+
let _ = x.try_update(Ordering::Release, Ordering::AcqRel, |old| Some(old + 1));
90+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
91+
let _ = x.update(Ordering::Release, Ordering::AcqRel, |old| old + 1);
92+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
93+
3294
let _ = x.fetch_update(Ordering::AcqRel, Ordering::AcqRel, |old| Some(old + 1));
3395
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
96+
let _ = x.try_update(Ordering::AcqRel, Ordering::AcqRel, |old| Some(old + 1));
97+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
98+
let _ = x.update(Ordering::AcqRel, Ordering::AcqRel, |old| old + 1);
99+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
100+
34101
let _ = x.fetch_update(Ordering::SeqCst, Ordering::AcqRel, |old| Some(old + 1));
35102
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
103+
let _ = x.try_update(Ordering::SeqCst, Ordering::AcqRel, |old| Some(old + 1));
104+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
105+
let _ = x.update(Ordering::SeqCst, Ordering::AcqRel, |old| old + 1);
106+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
36107

37108
// Release is always forbidden as a failure ordering
109+
38110
let _ = x.fetch_update(Ordering::Relaxed, Ordering::Release, |old| Some(old + 1));
39111
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
112+
let _ = x.try_update(Ordering::Relaxed, Ordering::Release, |old| Some(old + 1));
113+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
114+
let _ = x.update(Ordering::Relaxed, Ordering::Release, |old| old + 1);
115+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
116+
40117
let _ = x.fetch_update(Ordering::Acquire, Ordering::Release, |old| Some(old + 1));
41118
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
119+
let _ = x.try_update(Ordering::Acquire, Ordering::Release, |old| Some(old + 1));
120+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
121+
let _ = x.update(Ordering::Acquire, Ordering::Release, |old| old + 1);
122+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
123+
42124
let _ = x.fetch_update(Ordering::Release, Ordering::Release, |old| Some(old + 1));
43125
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
126+
let _ = x.try_update(Ordering::Release, Ordering::Release, |old| Some(old + 1));
127+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
128+
let _ = x.update(Ordering::Release, Ordering::Release, |old| old + 1);
129+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
130+
44131
let _ = x.fetch_update(Ordering::AcqRel, Ordering::Release, |old| Some(old + 1));
45132
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
133+
let _ = x.try_update(Ordering::AcqRel, Ordering::Release, |old| Some(old + 1));
134+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
135+
let _ = x.update(Ordering::AcqRel, Ordering::Release, |old| old + 1);
136+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
137+
46138
let _ = x.fetch_update(Ordering::SeqCst, Ordering::Release, |old| Some(old + 1));
47139
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
48-
140+
let _ = x.try_update(Ordering::SeqCst, Ordering::Release, |old| Some(old + 1));
141+
//~^ ERROR `try_update`'s failure ordering may not be `Release` or `AcqRel`
142+
let _ = x.update(Ordering::SeqCst, Ordering::Release, |old| old + 1);
143+
//~^ ERROR `update`'s failure ordering may not be `Release` or `AcqRel`
49144
}

0 commit comments

Comments
 (0)