diff --git a/include/atomic b/include/atomic index 8c0a06901..2eee3bd3a 100644 --- a/include/atomic +++ b/include/atomic @@ -755,12 +755,6 @@ struct __atomic_base // false __atomic_base(const __atomic_base&) = delete; __atomic_base& operator=(const __atomic_base&) = delete; __atomic_base& operator=(const __atomic_base&) volatile = delete; - _LIBCPP_INLINE_VISIBILITY - _Tp operator=(_Tp __d) volatile - {store(__d); return __d;} - _LIBCPP_INLINE_VISIBILITY - _Tp operator=(_Tp __d) - {store(__d); return __d;} }; // atomic @@ -855,6 +849,13 @@ struct atomic atomic() {} // = default; _LIBCPP_INLINE_VISIBILITY /*constexpr*/ atomic(_Tp __d) : __base(__d) {} + + _LIBCPP_INLINE_VISIBILITY + _Tp operator=(_Tp __d) volatile + {__base::store(__d); return __d;} + _LIBCPP_INLINE_VISIBILITY + _Tp operator=(_Tp __d) + {__base::store(__d); return __d;} }; // atomic @@ -863,12 +864,19 @@ template struct atomic<_Tp*> : public __atomic_base<_Tp*> { - typedef __atomic_base<_Tp> __base; + typedef __atomic_base<_Tp*> __base; _LIBCPP_INLINE_VISIBILITY atomic() {} // = default; _LIBCPP_INLINE_VISIBILITY /*constexpr*/ atomic(_Tp* __d) : __base(__d) {} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator=(_Tp* __d) volatile + {__base::store(__d); return __d;} + _LIBCPP_INLINE_VISIBILITY + _Tp* operator=(_Tp* __d) + {__base::store(__d); return __d;} + _LIBCPP_INLINE_VISIBILITY _Tp* fetch_add(ptrdiff_t __op, memory_order __m = memory_order_seq_cst) volatile @@ -1459,6 +1467,48 @@ atomic_fetch_xor_explicit(atomic<_Tp>* __o, _Tp __op, memory_order __m) return __o->fetch_xor(__op, __m); } +// Atomics for standard typedef types + +typedef atomic atomic_char; +typedef atomic atomic_schar; +typedef atomic atomic_uchar; +typedef atomic atomic_short; +typedef atomic atomic_ushort; +typedef atomic atomic_int; +typedef atomic atomic_uint; +typedef atomic atomic_long; +typedef atomic atomic_ulong; +typedef atomic atomic_llong; +typedef atomic atomic_ullong; +typedef atomic atomic_char16_t; +typedef atomic atomic_char32_t; +typedef atomic atomic_wchar_t; + +typedef atomic atomic_int_least8_t; +typedef atomic atomic_uint_least8_t; +typedef atomic atomic_int_least16_t; +typedef atomic atomic_uint_least16_t; +typedef atomic atomic_int_least32_t; +typedef atomic atomic_uint_least32_t; +typedef atomic atomic_int_least64_t; +typedef atomic atomic_uint_least64_t; + +typedef atomic atomic_int_fast8_t; +typedef atomic atomic_uint_fast8_t; +typedef atomic atomic_int_fast16_t; +typedef atomic atomic_uint_fast16_t; +typedef atomic atomic_int_fast32_t; +typedef atomic atomic_uint_fast32_t; +typedef atomic atomic_int_fast64_t; +typedef atomic atomic_uint_fast64_t; + +typedef atomic atomic_intptr_t; +typedef atomic atomic_uintptr_t; +typedef atomic atomic_size_t; +typedef atomic atomic_ptrdiff_t; +typedef atomic atomic_intmax_t; +typedef atomic atomic_uintmax_t; + /* // flag type and operations