2828
2929#include < memory>
3030
31+ // #include <stdatomic.h> // IWYU pragma: keep for atomic_* functions
32+
3133namespace STDEXEC ::__std {
3234#if STDEXEC_HAS_CUDA_STD_ATOMIC()
3335
@@ -44,7 +46,7 @@ namespace STDEXEC::__std {
4446 using cuda::std::atomic_thread_fence;
4547 using cuda::std::atomic_signal_fence;
4648
47- #else
49+ #else // ^^^ STDEXEC_HAS_CUDA_STD_ATOMIC() / vvv !STDEXEC_HAS_CUDA_STD_ATOMIC()
4850
4951 using std::atomic;
5052 using std::atomic_flag;
@@ -99,18 +101,20 @@ namespace STDEXEC::__std {
99101 __atomic_store_n (__ptr_, __desired, __map_memory_order (__order));
100102 }
101103 };
102- # endif
104+ # endif // ^^^ __cpp_lib_atomic_ref < 2018'06L
105+
106+ #endif // ^^^ !STDEXEC_HAS_CUDA_STD_ATOMIC()
103107
104108 constexpr memory_order __memory_order_load (memory_order __order) noexcept {
105109 return __order == memory_order_acq_rel ? memory_order_acquire
106110 : __order == memory_order_release ? memory_order_relaxed
107111 : __order;
108112 }
109113
110- # if __cpp_lib_atomic_shared_ptr >= 2017'11L
114+ #if __cpp_lib_atomic_shared_ptr >= 2017'11L
111115 template <class _Ty >
112116 using __atomic_shared_ptr = std::atomic<std::shared_ptr<_Ty>>;
113- # else
117+ #elif !STDEXEC_CLANG() || !STDEXEC_CUDA_COMPILATION()
114118 template <typename _Ty>
115119 struct __atomic_shared_ptr {
116120 using value_type = std::shared_ptr<_Ty>;
@@ -148,16 +152,17 @@ namespace STDEXEC::__std {
148152 }
149153
150154 std::shared_ptr<_Ty> load (memory_order __order = memory_order_seq_cst) const noexcept {
151- return atomic_load_explicit (&__ptr_, __order);
155+ return atomic_load_explicit (&__ptr_, static_cast <std::memory_order>( __order) );
152156 }
153157
154158 void store (std::shared_ptr<_Ty> __ptr, memory_order __order = memory_order_seq_cst) noexcept {
155- atomic_store_explicit (&__ptr_, std::move (__ptr), __order);
159+ atomic_store_explicit (&__ptr_, std::move (__ptr), static_cast <std::memory_order>( __order) );
156160 }
157161
158162 std::shared_ptr<_Ty>
159163 exchange (std::shared_ptr<_Ty> __ptr, memory_order __order = memory_order_seq_cst) noexcept {
160- return atomic_exchange_explicit (&__ptr_, std::move (__ptr), __order);
164+ return atomic_exchange_explicit (
165+ &__ptr_, std::move (__ptr), static_cast <std::memory_order>(__order));
161166 }
162167
163168 bool compare_exchange_weak (
@@ -166,15 +171,23 @@ namespace STDEXEC::__std {
166171 memory_order __success,
167172 memory_order __failure) noexcept {
168173 return atomic_compare_exchange_weak_explicit (
169- &__ptr_, &__expected, std::move (__desired), __success, __failure);
174+ &__ptr_,
175+ &__expected,
176+ std::move (__desired),
177+ static_cast <std::memory_order>(__success),
178+ static_cast <std::memory_order>(__failure));
170179 }
171180
172181 bool compare_exchange_weak (
173182 std::shared_ptr<_Ty>& __expected,
174183 std::shared_ptr<_Ty> __desired,
175184 memory_order __order = memory_order_seq_cst) noexcept {
176185 return atomic_compare_exchange_weak_explicit (
177- &__ptr_, &__expected, std::move (__desired), __order, __memory_order_load (__order));
186+ &__ptr_,
187+ &__expected,
188+ std::move (__desired),
189+ static_cast <std::memory_order>(__order),
190+ static_cast <std::memory_order>(__memory_order_load (__order)));
178191 }
179192
180193 bool compare_exchange_strong (
@@ -183,15 +196,23 @@ namespace STDEXEC::__std {
183196 memory_order __upon_success,
184197 memory_order __upon_failure) noexcept {
185198 return atomic_compare_exchange_strong_explicit (
186- &__ptr_, &__expected, std::move (__desired), __upon_success, __upon_failure);
199+ &__ptr_,
200+ &__expected,
201+ std::move (__desired),
202+ static_cast <std::memory_order>(__upon_success),
203+ static_cast <std::memory_order>(__upon_failure));
187204 }
188205
189206 bool compare_exchange_strong (
190207 std::shared_ptr<_Ty>& __expected,
191208 std::shared_ptr<_Ty> __desired,
192209 memory_order __order = memory_order_seq_cst) noexcept {
193210 return atomic_compare_exchange_strong_explicit (
194- &__ptr_, &__expected, std::move (__desired), __order, __memory_order_load (__order));
211+ &__ptr_,
212+ &__expected,
213+ std::move (__desired),
214+ static_cast <std::memory_order>(__order),
215+ static_cast <std::memory_order>(__memory_order_load (__order)));
195216 }
196217
197218 private:
@@ -201,7 +222,6 @@ namespace STDEXEC::__std {
201222 template <typename _Ty>
202223 __atomic_shared_ptr (std::shared_ptr<_Ty>) -> __atomic_shared_ptr<_Ty>;
203224
204- # endif
225+ #endif // ^^^ __cpp_lib_atomic_shared_ptr < 2017'11L
205226
206- #endif
207227} // namespace STDEXEC::__std
0 commit comments