Skip to content

Commit d50bc0f

Browse files
committed
Remove uses of unreachable_unchecked
See taiki-e/portable-atomic@8148fda for the context.
1 parent 2234dbd commit d50bc0f

File tree

10 files changed

+36
-79
lines changed

10 files changed

+36
-79
lines changed

src/arch/aarch64.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ macro_rules! atomic_rmw {
5454
// https://reviews.llvm.org/D141748
5555
#[cfg(target_env = "msvc")]
5656
Ordering::SeqCst => $op!("a", "l", "dmb ish"),
57-
_ => unreachable_unchecked!("{:?}", $order),
57+
_ => unreachable!("{:?}", $order),
5858
}
5959
};
6060
}
@@ -106,7 +106,7 @@ macro_rules! atomic {
106106
#[cfg(not(any(target_feature = "rcpc", atomic_maybe_uninit_target_feature = "rcpc")))]
107107
Ordering::Acquire => atomic_load!("a"),
108108
Ordering::SeqCst => atomic_load!("a"),
109-
_ => unreachable_unchecked!("{:?}", order),
109+
_ => unreachable!("{:?}", order),
110110
}
111111
}
112112
}
@@ -148,7 +148,7 @@ macro_rules! atomic {
148148
// https://reviews.llvm.org/D141748
149149
#[cfg(target_env = "msvc")]
150150
Ordering::SeqCst => atomic_store!("l", "dmb ish"),
151-
_ => unreachable_unchecked!("{:?}", order),
151+
_ => unreachable!("{:?}", order),
152152
}
153153
}
154154
}
@@ -471,7 +471,7 @@ macro_rules! atomic128 {
471471
options(nostack, preserves_flags),
472472
);
473473
},
474-
_ => unreachable_unchecked!("{:?}", order),
474+
_ => unreachable!("{:?}", order),
475475
}
476476
}
477477
#[cfg(not(any(target_feature = "lse2", atomic_maybe_uninit_target_feature = "lse2")))]
@@ -524,7 +524,7 @@ macro_rules! atomic128 {
524524
Ordering::Relaxed => atomic_load!("", ""),
525525
Ordering::Acquire => atomic_load!("a", ""),
526526
Ordering::SeqCst => atomic_load!("a", "l"),
527-
_ => unreachable_unchecked!("{:?}", order),
527+
_ => unreachable!("{:?}", order),
528528
}
529529
}
530530
}
@@ -565,7 +565,7 @@ macro_rules! atomic128 {
565565
Ordering::Relaxed => atomic_store!("", ""),
566566
Ordering::Release => atomic_store!("", "dmb ish"),
567567
Ordering::SeqCst => atomic_store!("dmb ish", "dmb ish"),
568-
_ => unreachable_unchecked!("{:?}", order),
568+
_ => unreachable!("{:?}", order),
569569
}
570570
}
571571
#[cfg(not(any(target_feature = "lse2", atomic_maybe_uninit_target_feature = "lse2")))]

src/arch/arm.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ macro_rules! atomic {
145145
Ordering::Relaxed => atomic_load!(asm_no_dmb, ""),
146146
// Acquire and SeqCst loads are equivalent.
147147
Ordering::Acquire | Ordering::SeqCst => atomic_load!(asm_use_dmb, dmb!()),
148-
_ => unreachable_unchecked!("{:?}", order),
148+
_ => unreachable!("{:?}", order),
149149
}
150150
}
151151
}
@@ -182,7 +182,7 @@ macro_rules! atomic {
182182
Ordering::Relaxed => atomic_store!(asm_no_dmb, "", ""),
183183
Ordering::Release => atomic_store!(asm_use_dmb, "", dmb!()),
184184
Ordering::SeqCst => atomic_store!(asm_use_dmb, dmb!(), dmb!()),
185-
_ => unreachable_unchecked!("{:?}", order),
185+
_ => unreachable!("{:?}", order),
186186
}
187187
}
188188
}
@@ -242,7 +242,7 @@ macro_rules! atomic {
242242
Ordering::AcqRel | Ordering::SeqCst => {
243243
atomic_swap!(asm_use_dmb, dmb!(), dmb!());
244244
}
245-
_ => unreachable_unchecked!("{:?}", order),
245+
_ => unreachable!("{:?}", order),
246246
}
247247
}
248248
}
@@ -399,7 +399,7 @@ macro_rules! atomic {
399399
// AcqRel and SeqCst compare_exchange are equivalent.
400400
(AcqRel | SeqCst, Relaxed) => cmpxchg_acqrel!(""),
401401
(AcqRel | SeqCst, _) => cmpxchg_acqrel!(dmb!()),
402-
_ => unreachable_unchecked!("{:?}, {:?}", success, failure),
402+
_ => unreachable!("{:?}, {:?}", success, failure),
403403
}
404404
debug_assert!(r == 0 || r == 1, "r={}", r);
405405
// 0 if the store was successful, 1 if no store was performed
@@ -539,7 +539,7 @@ macro_rules! atomic {
539539
// AcqRel and SeqCst compare_exchange_weak are equivalent.
540540
(AcqRel | SeqCst, Relaxed) => cmpxchg_weak_fail_load_relaxed!(dmb!()),
541541
(AcqRel | SeqCst, _) => cmpxchg_weak!(asm_use_dmb, dmb!(), dmb!()),
542-
_ => unreachable_unchecked!("{:?}, {:?}", success, failure),
542+
_ => unreachable!("{:?}, {:?}", success, failure),
543543
}
544544
debug_assert!(r == 0 || r == 1, "r={}", r);
545545
// 0 if the store was successful, 1 if no store was performed
@@ -600,7 +600,7 @@ macro_rules! atomic64 {
600600
Ordering::Relaxed => atomic_load!(asm_no_dmb, ""),
601601
// Acquire and SeqCst loads are equivalent.
602602
Ordering::Acquire | Ordering::SeqCst => atomic_load!(asm_use_dmb, dmb!()),
603-
_ => unreachable_unchecked!("{:?}", order),
603+
_ => unreachable!("{:?}", order),
604604
}
605605
}
606606
}
@@ -652,7 +652,7 @@ macro_rules! atomic64 {
652652
Ordering::Relaxed => atomic_store!(asm_no_dmb, "", ""),
653653
Ordering::Release => atomic_store!(asm_use_dmb, "", dmb!()),
654654
Ordering::SeqCst => atomic_store!(asm_use_dmb, dmb!(), dmb!()),
655-
_ => unreachable_unchecked!("{:?}", order),
655+
_ => unreachable!("{:?}", order),
656656
}
657657
}
658658
}
@@ -711,7 +711,7 @@ macro_rules! atomic64 {
711711
Ordering::Release => atomic_swap!(asm_use_dmb, "", dmb!()),
712712
// AcqRel and SeqCst swaps are equivalent.
713713
Ordering::AcqRel | Ordering::SeqCst => atomic_swap!(asm_use_dmb, dmb!(), dmb!()),
714-
_ => unreachable_unchecked!("{:?}", order),
714+
_ => unreachable!("{:?}", order),
715715
}
716716
}
717717
}
@@ -892,7 +892,7 @@ macro_rules! atomic64 {
892892
// AcqRel and SeqCst compare_exchange are equivalent.
893893
(AcqRel | SeqCst, Relaxed) => cmpxchg_acqrel!(""),
894894
(AcqRel | SeqCst, _) => cmpxchg_acqrel!(dmb!()),
895-
_ => unreachable_unchecked!("{:?}, {:?}", success, failure),
895+
_ => unreachable!("{:?}, {:?}", success, failure),
896896
}
897897
debug_assert!(r == 0 || r == 1, "r={}", r);
898898
// 0 if the store was successful, 1 if no store was performed
@@ -1059,7 +1059,7 @@ macro_rules! atomic64 {
10591059
// AcqRel and SeqCst compare_exchange_weak are equivalent.
10601060
(AcqRel | SeqCst, Relaxed) => cmpxchg_weak_fail_load_relaxed!(dmb!()),
10611061
(AcqRel | SeqCst, _) => cmpxchg_weak!(asm_use_dmb, dmb!(), dmb!()),
1062-
_ => unreachable_unchecked!("{:?}, {:?}", success, failure),
1062+
_ => unreachable!("{:?}, {:?}", success, failure),
10631063
}
10641064
debug_assert!(r == 0 || r == 1, "r={}", r);
10651065
// 0 if the store was successful, 1 if no store was performed

src/arch/armv8.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ macro_rules! atomic_rmw {
3131
Ordering::Release => $op!("r", "l"),
3232
// AcqRel and SeqCst RMWs are equivalent.
3333
Ordering::AcqRel | Ordering::SeqCst => $op!("a", "l"),
34-
_ => unreachable_unchecked!("{:?}", $order),
34+
_ => unreachable!("{:?}", $order),
3535
}
3636
};
3737
}
@@ -68,7 +68,7 @@ macro_rules! atomic {
6868
Ordering::Relaxed => atomic_load!("r"),
6969
// Acquire and SeqCst loads are equivalent.
7070
Ordering::Acquire | Ordering::SeqCst => atomic_load!("a"),
71-
_ => unreachable_unchecked!("{:?}", order),
71+
_ => unreachable!("{:?}", order),
7272
}
7373
}
7474
}
@@ -103,7 +103,7 @@ macro_rules! atomic {
103103
Ordering::Relaxed => atomic_store!("r"),
104104
// Release and SeqCst stores are equivalent.
105105
Ordering::Release | Ordering::SeqCst => atomic_store!("l"),
106-
_ => unreachable_unchecked!("{:?}", order),
106+
_ => unreachable!("{:?}", order),
107107
}
108108
}
109109
}
@@ -320,7 +320,7 @@ macro_rules! atomic64 {
320320
Ordering::Relaxed => atomic_load!("r"),
321321
// Acquire and SeqCst loads are equivalent.
322322
Ordering::Acquire | Ordering::SeqCst => atomic_load!("a"),
323-
_ => unreachable_unchecked!("{:?}", order),
323+
_ => unreachable!("{:?}", order),
324324
}
325325
}
326326
}

src/arch/mips.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ macro_rules! atomic_rmw {
4848
Ordering::Release => $op!("", "sync"),
4949
// AcqRel and SeqCst RMWs are equivalent.
5050
Ordering::AcqRel | Ordering::SeqCst => $op!("sync", "sync"),
51-
_ => unreachable_unchecked!("{:?}", $order),
51+
_ => unreachable!("{:?}", $order),
5252
}
5353
};
5454
}
@@ -89,7 +89,7 @@ macro_rules! atomic_load_store {
8989
Ordering::Relaxed => atomic_load!(""),
9090
// Acquire and SeqCst loads are equivalent.
9191
Ordering::Acquire | Ordering::SeqCst => atomic_load!("sync"),
92-
_ => unreachable_unchecked!("{:?}", order),
92+
_ => unreachable!("{:?}", order),
9393
}
9494
}
9595
}

src/arch/powerpc.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ macro_rules! atomic_rmw {
8282
Ordering::Release => $op!("", "lwsync"),
8383
Ordering::AcqRel => $op!("lwsync", "lwsync"),
8484
Ordering::SeqCst => $op!("lwsync", "sync"),
85-
_ => unreachable_unchecked!("{:?}", $order),
85+
_ => unreachable!("{:?}", $order),
8686
}
8787
};
8888
}
@@ -139,7 +139,7 @@ macro_rules! atomic_load_store {
139139
}
140140
Ordering::Acquire => atomic_load_acquire!(""),
141141
Ordering::SeqCst => atomic_load_acquire!("sync"),
142-
_ => unreachable_unchecked!("{:?}", order),
142+
_ => unreachable!("{:?}", order),
143143
}
144144
}
145145
#[cfg(target_arch = "powerpc")]
@@ -165,7 +165,7 @@ macro_rules! atomic_load_store {
165165
Ordering::Relaxed => atomic_load!("", ""),
166166
Ordering::Acquire => atomic_load!("lwsync", ""),
167167
Ordering::SeqCst => atomic_load!("lwsync", "sync"),
168-
_ => unreachable_unchecked!("{:?}", order),
168+
_ => unreachable!("{:?}", order),
169169
}
170170
}
171171
}
@@ -201,7 +201,7 @@ macro_rules! atomic_load_store {
201201
Ordering::Relaxed => atomic_store!(""),
202202
Ordering::Release => atomic_store!("lwsync"),
203203
Ordering::SeqCst => atomic_store!("sync"),
204-
_ => unreachable_unchecked!("{:?}", order),
204+
_ => unreachable!("{:?}", order),
205205
}
206206
}
207207
}
@@ -1096,7 +1096,7 @@ macro_rules! atomic128 {
10961096
}
10971097
Ordering::Acquire => atomic_load_acquire!(""),
10981098
Ordering::SeqCst => atomic_load_acquire!("sync"),
1099-
_ => unreachable_unchecked!("{:?}", order),
1099+
_ => unreachable!("{:?}", order),
11001100
}
11011101
}
11021102
}
@@ -1136,7 +1136,7 @@ macro_rules! atomic128 {
11361136
Ordering::Relaxed => atomic_store!(""),
11371137
Ordering::Release => atomic_store!("lwsync"),
11381138
Ordering::SeqCst => atomic_store!("sync"),
1139-
_ => unreachable_unchecked!("{:?}", order),
1139+
_ => unreachable!("{:?}", order),
11401140
}
11411141
}
11421142
}

src/arch/riscv.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ macro_rules! atomic_rmw_amo {
8989
Ordering::Release => $op!(".rl"),
9090
// AcqRel and SeqCst RMWs are equivalent.
9191
Ordering::AcqRel | Ordering::SeqCst => $op!(".aqrl"),
92-
_ => unreachable_unchecked!("{:?}", $order),
92+
_ => unreachable!("{:?}", $order),
9393
}
9494
};
9595
}
@@ -102,7 +102,7 @@ macro_rules! atomic_rmw_lr_sc {
102102
Ordering::Release => $op!("", ".rl"),
103103
Ordering::AcqRel => $op!(".aq", ".rl"),
104104
Ordering::SeqCst => $op!(".aqrl", ".rl"),
105-
_ => unreachable_unchecked!("{:?}", $order),
105+
_ => unreachable!("{:?}", $order),
106106
}
107107
};
108108
}
@@ -142,7 +142,7 @@ macro_rules! atomic_load_store {
142142
Ordering::Relaxed => atomic_load!("", ""),
143143
Ordering::Acquire => atomic_load!("fence r, rw", ""),
144144
Ordering::SeqCst => atomic_load!("fence r, rw", "fence rw, rw"),
145-
_ => unreachable_unchecked!("{:?}", order),
145+
_ => unreachable!("{:?}", order),
146146
}
147147
}
148148
}
@@ -178,7 +178,7 @@ macro_rules! atomic_load_store {
178178
Ordering::Relaxed => atomic_store!(""),
179179
// Release and SeqCst stores are equivalent.
180180
Ordering::Release | Ordering::SeqCst => atomic_store!("fence rw, w"),
181-
_ => unreachable_unchecked!("{:?}", order),
181+
_ => unreachable!("{:?}", order),
182182
}
183183
}
184184
}

src/arch/s390x.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ macro_rules! atomic_load_store {
8484
options(nostack, preserves_flags),
8585
);
8686
},
87-
_ => unreachable_unchecked!("{:?}", order),
87+
_ => unreachable!("{:?}", order),
8888
}
8989
}
9090
}
@@ -498,7 +498,7 @@ macro_rules! atomic128 {
498498
options(nostack, preserves_flags),
499499
);
500500
}
501-
_ => unreachable_unchecked!("{:?}", order),
501+
_ => unreachable!("{:?}", order),
502502
}
503503
}
504504
}

src/arch/x86.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ macro_rules! atomic {
120120
options(nostack, preserves_flags),
121121
);
122122
}
123-
_ => unreachable_unchecked!("{:?}", order),
123+
_ => unreachable!("{:?}", order),
124124
}
125125
}
126126
}
@@ -377,7 +377,7 @@ macro_rules! atomic64 {
377377
options(nostack),
378378
);
379379
}
380-
_ => unreachable_unchecked!("{:?}", order),
380+
_ => unreachable!("{:?}", order),
381381
}
382382
}
383383
#[cfg(not(target_feature = "sse"))]

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,6 @@ impl<T: Primitive> AtomicMaybeUninit<T> {
325325
where
326326
T: AtomicSwap,
327327
{
328-
utils::assert_swap_ordering(order);
329328
let mut out = MaybeUninit::<T>::uninit();
330329
// SAFETY: any data races are prevented by atomic intrinsics and the raw
331330
// pointer passed in is valid because we got it from a reference.

src/utils.rs

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,6 @@ macro_rules! static_assert {
1010
};
1111
}
1212

13-
/// Informs the compiler that this point in the code is not reachable, enabling
14-
/// further optimizations.
15-
///
16-
/// In release mode, this macro calls `core::hint::unreachable_unchecked`.
17-
/// In debug mode, this macro calls `unreachable!` just in case.
18-
///
19-
/// Note: When using `unreachable!`, the compiler cannot eliminate the
20-
/// unreachable branch in some compiler versions, even if the only pattern not
21-
/// covered is `#[non_exhaustive]`: <https://godbolt.org/z/68MnGa4o5>
22-
///
23-
/// # Safety
24-
///
25-
/// Reaching this function is completely undefined behavior.
26-
#[allow(unused_macros)]
27-
macro_rules! unreachable_unchecked {
28-
($($tt:tt)*) => {
29-
if cfg!(debug_assertions) {
30-
unreachable!($($tt)*);
31-
} else {
32-
// SAFETY: the caller must uphold the safety contract.
33-
// (To force the caller to use unsafe block for this macro, do not use
34-
// unsafe block here.)
35-
core::hint::unreachable_unchecked()
36-
}
37-
};
38-
}
39-
4013
/// Make the given function const if the given condition is true.
4114
macro_rules! const_fn {
4215
(
@@ -77,21 +50,6 @@ pub(crate) fn assert_store_ordering(order: Ordering) {
7750
}
7851
}
7952

80-
// We use unreachable_unchecked! macro to remove the panic path (see also macro docs).
81-
// Since Ordering is non_exhaustive, the caller of such a function must use this
82-
// assertion to prevent UB due to the addition of new orderings.
83-
#[inline]
84-
pub(crate) fn assert_swap_ordering(order: Ordering) {
85-
match order {
86-
Ordering::AcqRel
87-
| Ordering::Acquire
88-
| Ordering::Relaxed
89-
| Ordering::Release
90-
| Ordering::SeqCst => {}
91-
_ => unreachable!("{:?}", order),
92-
}
93-
}
94-
9553
// https://github.com/rust-lang/rust/blob/1.69.0/library/core/src/sync/atomic.rs#L3226
9654
#[inline]
9755
#[cfg_attr(debug_assertions, track_caller)]

0 commit comments

Comments
 (0)