@@ -40,38 +40,40 @@ struct __atomic_base // false
4040 return __cxx_atomic_is_lock_free (sizeof (__cxx_atomic_impl<_Tp>));
4141 }
4242 _LIBCPP_HIDE_FROM_ABI bool is_lock_free () const _NOEXCEPT {
43- return static_cast <__atomic_base const volatile *>( this )-> is_lock_free ( );
43+ return __cxx_atomic_is_lock_free ( sizeof (__cxx_atomic_impl<_Tp>) );
4444 }
4545 _LIBCPP_HIDE_FROM_ABI void store (_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT
4646 _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m) {
4747 std::__cxx_atomic_store (std::addressof (__a_), __d, __m);
4848 }
49- _LIBCPP_HIDE_FROM_ABI void store (_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT
50- _LIBCPP_CHECK_STORE_MEMORY_ORDER(__m) {
49+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void
50+ store (_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT _LIBCPP_CHECK_STORE_MEMORY_ORDER (__m) {
5151 std::__cxx_atomic_store (std::addressof (__a_), __d, __m);
5252 }
5353 _LIBCPP_HIDE_FROM_ABI _Tp load (memory_order __m = memory_order_seq_cst) const volatile _NOEXCEPT
5454 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) {
5555 return std::__cxx_atomic_load (std::addressof (__a_), __m);
5656 }
57- _LIBCPP_HIDE_FROM_ABI _Tp load (memory_order __m = memory_order_seq_cst) const _NOEXCEPT
57+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp load (memory_order __m = memory_order_seq_cst) const _NOEXCEPT
5858 _LIBCPP_CHECK_LOAD_MEMORY_ORDER(__m) {
5959 return std::__cxx_atomic_load (std::addressof (__a_), __m);
6060 }
6161 _LIBCPP_HIDE_FROM_ABI operator _Tp () const volatile _NOEXCEPT { return load (); }
62- _LIBCPP_HIDE_FROM_ABI operator _Tp () const _NOEXCEPT { return load (); }
62+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 operator _Tp () const _NOEXCEPT { return load (); }
6363 _LIBCPP_HIDE_FROM_ABI _Tp exchange (_Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
6464 return std::__cxx_atomic_exchange (std::addressof (__a_), __d, __m);
6565 }
66- _LIBCPP_HIDE_FROM_ABI _Tp exchange (_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
66+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp
67+ exchange (_Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
6768 return std::__cxx_atomic_exchange (std::addressof (__a_), __d, __m);
6869 }
6970 _LIBCPP_HIDE_FROM_ABI bool
7071 compare_exchange_weak (_Tp& __e, _Tp __d, memory_order __s, memory_order __f) volatile _NOEXCEPT
7172 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER (__s, __f) {
7273 return std::__cxx_atomic_compare_exchange_weak (std::addressof (__a_), std::addressof (__e), __d, __s, __f);
7374 }
74- _LIBCPP_HIDE_FROM_ABI bool compare_exchange_weak (_Tp& __e, _Tp __d, memory_order __s, memory_order __f) _NOEXCEPT
75+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool
76+ compare_exchange_weak (_Tp& __e, _Tp __d, memory_order __s, memory_order __f) _NOEXCEPT
7577 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER (__s, __f) {
7678 return std::__cxx_atomic_compare_exchange_weak (std::addressof (__a_), std::addressof (__e), __d, __s, __f);
7779 }
@@ -80,23 +82,24 @@ struct __atomic_base // false
8082 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER (__s, __f) {
8183 return std::__cxx_atomic_compare_exchange_strong (std::addressof (__a_), std::addressof (__e), __d, __s, __f);
8284 }
83- _LIBCPP_HIDE_FROM_ABI bool compare_exchange_strong (_Tp& __e, _Tp __d, memory_order __s, memory_order __f) _NOEXCEPT
85+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool
86+ compare_exchange_strong (_Tp& __e, _Tp __d, memory_order __s, memory_order __f) _NOEXCEPT
8487 _LIBCPP_CHECK_EXCHANGE_MEMORY_ORDER (__s, __f) {
8588 return std::__cxx_atomic_compare_exchange_strong (std::addressof (__a_), std::addressof (__e), __d, __s, __f);
8689 }
8790 _LIBCPP_HIDE_FROM_ABI bool
8891 compare_exchange_weak (_Tp& __e, _Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
8992 return std::__cxx_atomic_compare_exchange_weak (std::addressof (__a_), std::addressof (__e), __d, __m, __m);
9093 }
91- _LIBCPP_HIDE_FROM_ABI bool
94+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool
9295 compare_exchange_weak (_Tp& __e, _Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
9396 return std::__cxx_atomic_compare_exchange_weak (std::addressof (__a_), std::addressof (__e), __d, __m, __m);
9497 }
9598 _LIBCPP_HIDE_FROM_ABI bool
9699 compare_exchange_strong (_Tp& __e, _Tp __d, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
97100 return std::__cxx_atomic_compare_exchange_strong (std::addressof (__a_), std::addressof (__e), __d, __m, __m);
98101 }
99- _LIBCPP_HIDE_FROM_ABI bool
102+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 bool
100103 compare_exchange_strong (_Tp& __e, _Tp __d, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
101104 return std::__cxx_atomic_compare_exchange_strong (std::addressof (__a_), std::addressof (__e), __d, __m, __m);
102105 }
@@ -105,23 +108,37 @@ struct __atomic_base // false
105108 volatile _NOEXCEPT {
106109 std::__atomic_wait (*this , __v, __m);
107110 }
108- _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void
111+ _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void
109112 wait (_Tp __v, memory_order __m = memory_order_seq_cst) const _NOEXCEPT {
110- std::__atomic_wait (*this , __v, __m);
113+ if (__libcpp_is_constant_evaluated ()) {
114+ if (this ->load (__m) != __v) {
115+ __builtin_trap ();
116+ }
117+ } else {
118+ std::__atomic_wait (*this , __v, __m);
119+ }
111120 }
112121 _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one () volatile _NOEXCEPT {
113122 std::__atomic_notify_one (*this );
114123 }
115- _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_one () _NOEXCEPT { std::__atomic_notify_one (*this ); }
124+ _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void notify_one () _NOEXCEPT {
125+ if !consteval {
126+ std::__atomic_notify_one (*this );
127+ }
128+ }
116129 _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all () volatile _NOEXCEPT {
117130 std::__atomic_notify_all (*this );
118131 }
119- _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI void notify_all () _NOEXCEPT { std::__atomic_notify_all (*this ); }
132+ _LIBCPP_AVAILABILITY_SYNC _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 void notify_all () _NOEXCEPT {
133+ if !consteval {
134+ std::__atomic_notify_all (*this );
135+ }
136+ }
120137
121138#if _LIBCPP_STD_VER >= 20
122139 _LIBCPP_HIDE_FROM_ABI constexpr __atomic_base () noexcept (is_nothrow_default_constructible_v<_Tp>) : __a_(_Tp()) {}
123140#else
124- _LIBCPP_HIDE_FROM_ABI __atomic_base () _NOEXCEPT = default;
141+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __atomic_base () _NOEXCEPT = default;
125142#endif
126143
127144 _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR __atomic_base (_Tp __d) _NOEXCEPT : __a_(__d) {}
@@ -142,52 +159,67 @@ struct __atomic_base<_Tp, true> : public __atomic_base<_Tp, false> {
142159 _LIBCPP_HIDE_FROM_ABI _Tp fetch_add (_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
143160 return std::__cxx_atomic_fetch_add (std::addressof (this ->__a_ ), __op, __m);
144161 }
145- _LIBCPP_HIDE_FROM_ABI _Tp fetch_add (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
162+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp
163+ fetch_add (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
146164 return std::__cxx_atomic_fetch_add (std::addressof (this ->__a_ ), __op, __m);
147165 }
148166 _LIBCPP_HIDE_FROM_ABI _Tp fetch_sub (_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
149167 return std::__cxx_atomic_fetch_sub (std::addressof (this ->__a_ ), __op, __m);
150168 }
151- _LIBCPP_HIDE_FROM_ABI _Tp fetch_sub (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
169+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp
170+ fetch_sub (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
152171 return std::__cxx_atomic_fetch_sub (std::addressof (this ->__a_ ), __op, __m);
153172 }
154173 _LIBCPP_HIDE_FROM_ABI _Tp fetch_and (_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
155174 return std::__cxx_atomic_fetch_and (std::addressof (this ->__a_ ), __op, __m);
156175 }
157- _LIBCPP_HIDE_FROM_ABI _Tp fetch_and (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
176+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp
177+ fetch_and (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
158178 return std::__cxx_atomic_fetch_and (std::addressof (this ->__a_ ), __op, __m);
159179 }
160180 _LIBCPP_HIDE_FROM_ABI _Tp fetch_or (_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
161181 return std::__cxx_atomic_fetch_or (std::addressof (this ->__a_ ), __op, __m);
162182 }
163- _LIBCPP_HIDE_FROM_ABI _Tp fetch_or (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
183+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp
184+ fetch_or (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
164185 return std::__cxx_atomic_fetch_or (std::addressof (this ->__a_ ), __op, __m);
165186 }
166187 _LIBCPP_HIDE_FROM_ABI _Tp fetch_xor (_Tp __op, memory_order __m = memory_order_seq_cst) volatile _NOEXCEPT {
167188 return std::__cxx_atomic_fetch_xor (std::addressof (this ->__a_ ), __op, __m);
168189 }
169- _LIBCPP_HIDE_FROM_ABI _Tp fetch_xor (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
190+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp
191+ fetch_xor (_Tp __op, memory_order __m = memory_order_seq_cst) _NOEXCEPT {
170192 return std::__cxx_atomic_fetch_xor (std::addressof (this ->__a_ ), __op, __m);
171193 }
172194
173195 _LIBCPP_HIDE_FROM_ABI _Tp operator ++(int ) volatile _NOEXCEPT { return fetch_add (_Tp (1 )); }
174- _LIBCPP_HIDE_FROM_ABI _Tp operator ++(int ) _NOEXCEPT { return fetch_add (_Tp (1 )); }
196+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator ++(int ) _NOEXCEPT { return fetch_add (_Tp (1 )); }
175197 _LIBCPP_HIDE_FROM_ABI _Tp operator --(int ) volatile _NOEXCEPT { return fetch_sub (_Tp (1 )); }
176- _LIBCPP_HIDE_FROM_ABI _Tp operator --(int ) _NOEXCEPT { return fetch_sub (_Tp (1 )); }
198+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator --(int ) _NOEXCEPT { return fetch_sub (_Tp (1 )); }
177199 _LIBCPP_HIDE_FROM_ABI _Tp operator ++() volatile _NOEXCEPT { return fetch_add (_Tp (1 )) + _Tp (1 ); }
178- _LIBCPP_HIDE_FROM_ABI _Tp operator ++() _NOEXCEPT { return fetch_add (_Tp (1 )) + _Tp (1 ); }
200+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator ++() _NOEXCEPT { return fetch_add (_Tp (1 )) + _Tp (1 ); }
179201 _LIBCPP_HIDE_FROM_ABI _Tp operator --() volatile _NOEXCEPT { return fetch_sub (_Tp (1 )) - _Tp (1 ); }
180- _LIBCPP_HIDE_FROM_ABI _Tp operator --() _NOEXCEPT { return fetch_sub (_Tp (1 )) - _Tp (1 ); }
202+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator --() _NOEXCEPT { return fetch_sub (_Tp (1 )) - _Tp (1 ); }
181203 _LIBCPP_HIDE_FROM_ABI _Tp operator +=(_Tp __op) volatile _NOEXCEPT { return fetch_add (__op) + __op; }
182- _LIBCPP_HIDE_FROM_ABI _Tp operator +=(_Tp __op) _NOEXCEPT { return fetch_add (__op) + __op; }
204+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator +=(_Tp __op) _NOEXCEPT {
205+ return fetch_add (__op) + __op;
206+ }
183207 _LIBCPP_HIDE_FROM_ABI _Tp operator -=(_Tp __op) volatile _NOEXCEPT { return fetch_sub (__op) - __op; }
184- _LIBCPP_HIDE_FROM_ABI _Tp operator -=(_Tp __op) _NOEXCEPT { return fetch_sub (__op) - __op; }
208+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator -=(_Tp __op) _NOEXCEPT {
209+ return fetch_sub (__op) - __op;
210+ }
185211 _LIBCPP_HIDE_FROM_ABI _Tp operator &=(_Tp __op) volatile _NOEXCEPT { return fetch_and (__op) & __op; }
186- _LIBCPP_HIDE_FROM_ABI _Tp operator &=(_Tp __op) _NOEXCEPT { return fetch_and (__op) & __op; }
212+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator &=(_Tp __op) _NOEXCEPT {
213+ return fetch_and (__op) & __op;
214+ }
187215 _LIBCPP_HIDE_FROM_ABI _Tp operator |=(_Tp __op) volatile _NOEXCEPT { return fetch_or (__op) | __op; }
188- _LIBCPP_HIDE_FROM_ABI _Tp operator |=(_Tp __op) _NOEXCEPT { return fetch_or (__op) | __op; }
216+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator |=(_Tp __op) _NOEXCEPT {
217+ return fetch_or (__op) | __op;
218+ }
189219 _LIBCPP_HIDE_FROM_ABI _Tp operator ^=(_Tp __op) volatile _NOEXCEPT { return fetch_xor (__op) ^ __op; }
190- _LIBCPP_HIDE_FROM_ABI _Tp operator ^=(_Tp __op) _NOEXCEPT { return fetch_xor (__op) ^ __op; }
220+ _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp operator ^=(_Tp __op) _NOEXCEPT {
221+ return fetch_xor (__op) ^ __op;
222+ }
191223};
192224
193225// Here we need _IsIntegral because the default template argument is not enough
@@ -196,7 +228,8 @@ struct __atomic_base<_Tp, true> : public __atomic_base<_Tp, false> {
196228// __atomic_base<int, false>. So specializing __atomic_base<_Tp> does not work
197229template <class _Tp , bool _IsIntegral>
198230struct __atomic_waitable_traits <__atomic_base<_Tp, _IsIntegral> > {
199- static _LIBCPP_HIDE_FROM_ABI _Tp __atomic_load (const __atomic_base<_Tp, _IsIntegral>& __a, memory_order __order) {
231+ static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 _Tp
232+ __atomic_load (const __atomic_base<_Tp, _IsIntegral>& __a, memory_order __order) {
200233 return __a.load (__order);
201234 }
202235
@@ -205,7 +238,7 @@ struct __atomic_waitable_traits<__atomic_base<_Tp, _IsIntegral> > {
205238 return __this.load (__order);
206239 }
207240
208- static _LIBCPP_HIDE_FROM_ABI const __cxx_atomic_impl<_Tp>*
241+ static _LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX26 const __cxx_atomic_impl<_Tp>*
209242 __atomic_contention_address (const __atomic_base<_Tp, _IsIntegral>& __a) {
210243 return std::addressof (__a.__a_ );
211244 }
0 commit comments