Skip to content

Commit dbb0ca0

Browse files
authored
Unrolled build for #148601
Rollup merge of #148601 - GrigorenkoPV:invalid_atomic_ordering, r=Kivooeo `invalid_atomic_ordering`: also lint `update` & `try_update` Split from #148590 Tracking issue for `update` and `try_update`: #135894
2 parents acda5e9 + bd23d55 commit dbb0ca0

File tree

6 files changed

+399
-135
lines changed

6 files changed

+399
-135
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
@@ -2280,6 +2280,7 @@ symbols! {
22802280
try_from_fn,
22812281
try_into,
22822282
try_trait_v2,
2283+
try_update,
22832284
tt,
22842285
tuple,
22852286
tuple_indexing,
@@ -2397,6 +2398,7 @@ symbols! {
23972398
unwrap,
23982399
unwrap_binder,
23992400
unwrap_or,
2401+
update,
24002402
use_cloned,
24012403
use_extern_macros,
24022404
use_nested_groups,

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

Lines changed: 0 additions & 49 deletions
This file was deleted.

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

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
//@ only-x86_64
2+
#![feature(atomic_try_update)]
3+
4+
use std::sync::atomic::{AtomicIsize, Ordering};
5+
6+
fn main() {
7+
// `fetch_update` testing
8+
let x = AtomicIsize::new(0);
9+
10+
// Allowed ordering combos
11+
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+
15+
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+
19+
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+
23+
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+
27+
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+
31+
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+
35+
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+
39+
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+
43+
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+
47+
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+
51+
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+
55+
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+
59+
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+
63+
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+
67+
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);
70+
71+
// AcqRel is always forbidden as a failure ordering
72+
73+
let _ = x.fetch_update(Ordering::Relaxed, Ordering::AcqRel, |old| Some(old + 1));
74+
//~^ 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+
80+
let _ = x.fetch_update(Ordering::Acquire, Ordering::AcqRel, |old| Some(old + 1));
81+
//~^ 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+
87+
let _ = x.fetch_update(Ordering::Release, Ordering::AcqRel, |old| Some(old + 1));
88+
//~^ 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+
94+
let _ = x.fetch_update(Ordering::AcqRel, Ordering::AcqRel, |old| Some(old + 1));
95+
//~^ 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+
101+
let _ = x.fetch_update(Ordering::SeqCst, Ordering::AcqRel, |old| Some(old + 1));
102+
//~^ 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`
107+
108+
// Release is always forbidden as a failure ordering
109+
110+
let _ = x.fetch_update(Ordering::Relaxed, Ordering::Release, |old| Some(old + 1));
111+
//~^ 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+
117+
let _ = x.fetch_update(Ordering::Acquire, Ordering::Release, |old| Some(old + 1));
118+
//~^ 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+
124+
let _ = x.fetch_update(Ordering::Release, Ordering::Release, |old| Some(old + 1));
125+
//~^ 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+
131+
let _ = x.fetch_update(Ordering::AcqRel, Ordering::Release, |old| Some(old + 1));
132+
//~^ 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+
138+
let _ = x.fetch_update(Ordering::SeqCst, Ordering::Release, |old| Some(old + 1));
139+
//~^ ERROR `fetch_update`'s failure ordering may not be `Release` or `AcqRel`
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`
144+
}

0 commit comments

Comments
 (0)