mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-11-30 00:51:02 +00:00
[libcxx] Allow use of <atomic> in C++03. Try 3.
Summary: After putting this question up on cfe-dev I have decided that it would be best to allow the use of `<atomic>` in C++03. Although static initialization is a concern the syntax required to get it is C++11 only. Meaning that C++11 constant static initialization cannot silently break in C++03, it will always cause a syntax error. Furthermore `ATOMIC_VAR_INIT` and `ATOMIC_FLAG_INIT` remain defined in C++03 even though they cannot be used because C++03 usages will cause better error messages. The main change in this patch is to replace `__has_feature(cxx_atomic)`, which only returns true when C++ >= 11, to `__has_extension(c_atomic)` which returns true whenever clang supports the required atomic builtins. This patch adds the following macros: * `_LIBCPP_HAS_C_ATOMIC_IMP` - Defined on clang versions which provide the C `_Atomic` keyword. * `_LIBCPP_HAS_GCC_ATOMIC_IMP` - Defined on GCC > 4.7. We must use the fallback atomic implementation. * `_LIBCPP_HAS_NO_ATOMIC_HEADER` - Defined when it is not safe to include `<atomic>`. `_LIBCPP_HAS_C_ATOMIC_IMP` and `_LIBCPP_HAS_GCC_ATOMIC_IMP` are mutually exclusive, only one should be defined. If neither is defined then `<atomic>` is not implemented and including `<atomic>` will issue an error. Reviewers: chandlerc, jroelofs, mclow.lists Subscribers: cfe-commits Differential Revision: http://reviews.llvm.org/D11555 llvm-svn: 245463
This commit is contained in:
parent
24b64a9405
commit
749adeba3d
@ -37,6 +37,9 @@
|
|||||||
#ifndef __has_builtin
|
#ifndef __has_builtin
|
||||||
#define __has_builtin(__x) 0
|
#define __has_builtin(__x) 0
|
||||||
#endif
|
#endif
|
||||||
|
#ifndef __has_extension
|
||||||
|
#define __has_extension(__x) 0
|
||||||
|
#endif
|
||||||
#ifndef __has_feature
|
#ifndef __has_feature
|
||||||
#define __has_feature(__x) 0
|
#define __has_feature(__x) 0
|
||||||
#endif
|
#endif
|
||||||
@ -773,4 +776,15 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|||||||
#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // _LIBCPP_CONFIG
|
#if __has_extension(c_atomic)
|
||||||
|
#define _LIBCPP_HAS_C_ATOMIC_IMP
|
||||||
|
#elif _GNUC_VER > 407
|
||||||
|
#define _LIBCPP_HAS_GCC_ATOMIC_IMP
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (!defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)) \
|
||||||
|
|| defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
#define _LIBCPP_HAS_NO_ATOMIC_HEADER
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // _LIBCPP_CONFIG
|
||||||
|
@ -535,21 +535,20 @@ void atomic_signal_fence(memory_order m) noexcept;
|
|||||||
|
|
||||||
#ifdef _LIBCPP_HAS_NO_THREADS
|
#ifdef _LIBCPP_HAS_NO_THREADS
|
||||||
#error <atomic> is not supported on this single threaded system
|
#error <atomic> is not supported on this single threaded system
|
||||||
#else // !_LIBCPP_HAS_NO_THREADS
|
#endif
|
||||||
|
#if !defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
|
||||||
|
#error <atomic> is not implemented
|
||||||
|
#endif
|
||||||
|
|
||||||
_LIBCPP_BEGIN_NAMESPACE_STD
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
#if !__has_feature(cxx_atomic) && _GNUC_VER < 407
|
|
||||||
#error <atomic> is not implemented
|
|
||||||
#else
|
|
||||||
|
|
||||||
typedef enum memory_order
|
typedef enum memory_order
|
||||||
{
|
{
|
||||||
memory_order_relaxed, memory_order_consume, memory_order_acquire,
|
memory_order_relaxed, memory_order_consume, memory_order_acquire,
|
||||||
memory_order_release, memory_order_acq_rel, memory_order_seq_cst
|
memory_order_release, memory_order_acq_rel, memory_order_seq_cst
|
||||||
} memory_order;
|
} memory_order;
|
||||||
|
|
||||||
#if _GNUC_VER >= 407
|
#if defined(_LIBCPP_HAS_GCC_ATOMIC_IMP)
|
||||||
namespace __gcc_atomic {
|
namespace __gcc_atomic {
|
||||||
template <typename _Tp>
|
template <typename _Tp>
|
||||||
struct __gcc_atomic_t {
|
struct __gcc_atomic_t {
|
||||||
@ -805,7 +804,7 @@ static inline _Tp __c11_atomic_fetch_xor(_Atomic(_Tp)* __a, _Tp __pattern,
|
|||||||
return __atomic_fetch_xor(&__a->__a_value, __pattern,
|
return __atomic_fetch_xor(&__a->__a_value, __pattern,
|
||||||
__gcc_atomic::__to_gcc_order(__order));
|
__gcc_atomic::__to_gcc_order(__order));
|
||||||
}
|
}
|
||||||
#endif // _GNUC_VER >= 407
|
#endif // _LIBCPP_HAS_GCC_ATOMIC_IMP
|
||||||
|
|
||||||
template <class _Tp>
|
template <class _Tp>
|
||||||
inline _LIBCPP_INLINE_VISIBILITY
|
inline _LIBCPP_INLINE_VISIBILITY
|
||||||
@ -825,7 +824,7 @@ struct __atomic_base // false
|
|||||||
_LIBCPP_INLINE_VISIBILITY
|
_LIBCPP_INLINE_VISIBILITY
|
||||||
bool is_lock_free() const volatile _NOEXCEPT
|
bool is_lock_free() const volatile _NOEXCEPT
|
||||||
{
|
{
|
||||||
#if __has_feature(cxx_atomic)
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP)
|
||||||
return __c11_atomic_is_lock_free(sizeof(_Tp));
|
return __c11_atomic_is_lock_free(sizeof(_Tp));
|
||||||
#else
|
#else
|
||||||
return __atomic_is_lock_free(sizeof(_Tp), 0);
|
return __atomic_is_lock_free(sizeof(_Tp), 0);
|
||||||
@ -1779,8 +1778,6 @@ typedef atomic<uintmax_t> atomic_uintmax_t;
|
|||||||
#define ATOMIC_FLAG_INIT {false}
|
#define ATOMIC_FLAG_INIT {false}
|
||||||
#define ATOMIC_VAR_INIT(__v) {__v}
|
#define ATOMIC_VAR_INIT(__v) {__v}
|
||||||
|
|
||||||
// lock-free property
|
|
||||||
|
|
||||||
#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
|
#define ATOMIC_BOOL_LOCK_FREE __GCC_ATOMIC_BOOL_LOCK_FREE
|
||||||
#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
|
#define ATOMIC_CHAR_LOCK_FREE __GCC_ATOMIC_CHAR_LOCK_FREE
|
||||||
#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
|
#define ATOMIC_CHAR16_T_LOCK_FREE __GCC_ATOMIC_CHAR16_T_LOCK_FREE
|
||||||
@ -1792,10 +1789,6 @@ typedef atomic<uintmax_t> atomic_uintmax_t;
|
|||||||
#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
|
#define ATOMIC_LLONG_LOCK_FREE __GCC_ATOMIC_LLONG_LOCK_FREE
|
||||||
#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
|
#define ATOMIC_POINTER_LOCK_FREE __GCC_ATOMIC_POINTER_LOCK_FREE
|
||||||
|
|
||||||
#endif // !__has_feature(cxx_atomic)
|
|
||||||
|
|
||||||
_LIBCPP_END_NAMESPACE_STD
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
#endif // !_LIBCPP_HAS_NO_THREADS
|
|
||||||
|
|
||||||
#endif // _LIBCPP_ATOMIC
|
#endif // _LIBCPP_ATOMIC
|
||||||
|
@ -216,7 +216,7 @@ storage-class-specifier const error_category& iostream_category() noexcept;
|
|||||||
#include <__locale>
|
#include <__locale>
|
||||||
#include <system_error>
|
#include <system_error>
|
||||||
|
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
|
||||||
#include <atomic> // for __xindex_
|
#include <atomic> // for __xindex_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -367,7 +367,9 @@ private:
|
|||||||
int* __index_;
|
int* __index_;
|
||||||
size_t __event_size_;
|
size_t __event_size_;
|
||||||
size_t __event_cap_;
|
size_t __event_cap_;
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
// TODO(EricWF): Enable this for both Clang and GCC. Currently it is only
|
||||||
|
// enabled with clang.
|
||||||
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
static atomic<int> __xindex_;
|
static atomic<int> __xindex_;
|
||||||
#else
|
#else
|
||||||
static int __xindex_;
|
static int __xindex_;
|
||||||
|
@ -612,7 +612,7 @@ void* align(size_t alignment, size_t size, void*& ptr, size_t& space);
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#if !defined(_LIBCPP_HAS_NO_ATOMIC_HEADER)
|
||||||
# include <atomic>
|
# include <atomic>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -5381,7 +5381,9 @@ inline _LIBCPP_INLINE_VISIBILITY
|
|||||||
basic_ostream<_CharT, _Traits>&
|
basic_ostream<_CharT, _Traits>&
|
||||||
operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
|
operator<<(basic_ostream<_CharT, _Traits>& __os, shared_ptr<_Yp> const& __p);
|
||||||
|
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
// TODO(EricWF): Enable this for both Clang and GCC. Currently it is only
|
||||||
|
// enabled with clang.
|
||||||
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
|
||||||
class _LIBCPP_TYPE_VIS __sp_mut
|
class _LIBCPP_TYPE_VIS __sp_mut
|
||||||
{
|
{
|
||||||
@ -5507,7 +5509,7 @@ atomic_compare_exchange_weak_explicit(shared_ptr<_Tp>* __p, shared_ptr<_Tp>* __v
|
|||||||
return atomic_compare_exchange_weak(__p, __v, __w);
|
return atomic_compare_exchange_weak(__p, __v, __w);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#endif // defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
|
||||||
//enum class
|
//enum class
|
||||||
struct _LIBCPP_TYPE_VIS pointer_safety
|
struct _LIBCPP_TYPE_VIS pointer_safety
|
||||||
|
@ -152,7 +152,7 @@ ios_base::getloc() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
// xalloc
|
// xalloc
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
atomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0);
|
atomic<int> ios_base::__xindex_ = ATOMIC_VAR_INIT(0);
|
||||||
#else
|
#else
|
||||||
int ios_base::__xindex_ = 0;
|
int ios_base::__xindex_ = 0;
|
||||||
|
@ -124,7 +124,7 @@ __shared_weak_count::__get_deleter(const type_info&) const _NOEXCEPT
|
|||||||
|
|
||||||
#endif // _LIBCPP_NO_RTTI
|
#endif // _LIBCPP_NO_RTTI
|
||||||
|
|
||||||
#if __has_feature(cxx_atomic) && !defined(_LIBCPP_HAS_NO_THREADS)
|
#if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
|
||||||
static const std::size_t __sp_mut_count = 16;
|
static const std::size_t __sp_mut_count = 16;
|
||||||
static pthread_mutex_t mut_back_imp[__sp_mut_count] =
|
static pthread_mutex_t mut_back_imp[__sp_mut_count] =
|
||||||
@ -177,7 +177,7 @@ __get_sp_mut(const void* p)
|
|||||||
return muts[hash<const void*>()(p) & (__sp_mut_count-1)];
|
return muts[hash<const void*>()(p) & (__sp_mut_count-1)];
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // __has_feature(cxx_atomic) && !_LIBCPP_HAS_NO_THREADS
|
#endif // defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
|
||||||
|
|
||||||
void
|
void
|
||||||
declare_reachable(void*)
|
declare_reachable(void*)
|
||||||
|
@ -22,13 +22,13 @@
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear(&f);
|
atomic_flag_clear(&f);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear(&f);
|
atomic_flag_clear(&f);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
|
@ -22,37 +22,37 @@
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
|
atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear_explicit(&f, std::memory_order_release);
|
atomic_flag_clear_explicit(&f, std::memory_order_release);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
|
atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
|
atomic_flag_clear_explicit(&f, std::memory_order_relaxed);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear_explicit(&f, std::memory_order_release);
|
atomic_flag_clear_explicit(&f, std::memory_order_release);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
|
atomic_flag_clear_explicit(&f, std::memory_order_seq_cst);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
|
@ -22,49 +22,49 @@
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear();
|
f.clear();
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear(std::memory_order_relaxed);
|
f.clear(std::memory_order_relaxed);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear(std::memory_order_release);
|
f.clear(std::memory_order_release);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
std::atomic_flag f = ATOMIC_FLAG_INIT;
|
std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear(std::memory_order_seq_cst);
|
f.clear(std::memory_order_seq_cst);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear();
|
f.clear();
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear(std::memory_order_relaxed);
|
f.clear(std::memory_order_relaxed);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear(std::memory_order_release);
|
f.clear(std::memory_order_release);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
volatile std::atomic_flag f = ATOMIC_FLAG_INIT;
|
volatile std::atomic_flag f(false);
|
||||||
f.test_and_set();
|
f.test_and_set();
|
||||||
f.clear(std::memory_order_seq_cst);
|
f.clear(std::memory_order_seq_cst);
|
||||||
assert(f.test_and_set() == 0);
|
assert(f.test_and_set() == 0);
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// UNSUPPORTED: libcpp-has-no-threads
|
// UNSUPPORTED: libcpp-has-no-threads
|
||||||
|
// XFAIL: c++98, c++03
|
||||||
|
|
||||||
// <atomic>
|
// <atomic>
|
||||||
|
|
||||||
|
25
libcxx/test/std/atomics/atomics.flag/init03.pass.cpp
Normal file
25
libcxx/test/std/atomics/atomics.flag/init03.pass.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
// Source Licenses. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// UNSUPPORTED: libcpp-has-no-threads
|
||||||
|
|
||||||
|
// <atomic>
|
||||||
|
|
||||||
|
// struct atomic_flag
|
||||||
|
|
||||||
|
// TESTING EXTENSION atomic_flag(bool)
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
std::atomic_flag f(false);
|
||||||
|
assert(f.test_and_set() == 0);
|
||||||
|
}
|
@ -24,10 +24,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A a;
|
A a;
|
||||||
@ -52,37 +53,10 @@ test()
|
|||||||
assert(a == T(2));
|
assert(a == T(2));
|
||||||
assert(t == T(2));
|
assert(t == T(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -27,10 +27,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A a;
|
A a;
|
||||||
@ -59,37 +60,10 @@ test()
|
|||||||
assert(a == T(2));
|
assert(a == T(2));
|
||||||
assert(t == T(2));
|
assert(t == T(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -25,11 +25,11 @@
|
|||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
#include <cmpxchg_loop.h>
|
#include <cmpxchg_loop.h>
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A a;
|
A a;
|
||||||
@ -54,37 +54,10 @@ test()
|
|||||||
assert(a == T(2));
|
assert(a == T(2));
|
||||||
assert(t == T(2));
|
assert(t == T(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -29,10 +29,11 @@
|
|||||||
|
|
||||||
#include <cmpxchg_loop.h>
|
#include <cmpxchg_loop.h>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A a;
|
A a;
|
||||||
@ -61,37 +62,10 @@ test()
|
|||||||
assert(a == T(2));
|
assert(a == T(2));
|
||||||
assert(t == T(2));
|
assert(t == T(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
std::atomic_init(&t, T(1));
|
std::atomic_init(&t, T(1));
|
||||||
@ -37,37 +38,11 @@ test()
|
|||||||
std::atomic_init(&vt, T(3));
|
std::atomic_init(&vt, T(3));
|
||||||
assert(std::atomic_exchange(&vt, T(4)) == T(3));
|
assert(std::atomic_exchange(&vt, T(4)) == T(3));
|
||||||
assert(vt == T(4));
|
assert(vt == T(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
std::atomic_init(&t, T(1));
|
std::atomic_init(&t, T(1));
|
||||||
@ -39,37 +40,11 @@ test()
|
|||||||
assert(std::atomic_exchange_explicit(&vt, T(4), std::memory_order_seq_cst)
|
assert(std::atomic_exchange_explicit(&vt, T(4), std::memory_order_seq_cst)
|
||||||
== T(3));
|
== T(3));
|
||||||
assert(vt == T(4));
|
assert(vt == T(4));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -32,10 +32,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -50,62 +51,33 @@ test()
|
|||||||
assert(std::atomic_fetch_add(&t, T(2)) == T(1));
|
assert(std::atomic_fetch_add(&t, T(2)) == T(1));
|
||||||
assert(t == T(3));
|
assert(t == T(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
|
||||||
void
|
|
||||||
testp()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
|
||||||
typedef typename std::remove_pointer<T>::type X;
|
|
||||||
A t;
|
|
||||||
std::atomic_init(&t, T(1*sizeof(X)));
|
|
||||||
assert(std::atomic_fetch_add(&t, 2) == T(1*sizeof(X)));
|
|
||||||
assert(t == T(3*sizeof(X)));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
|
||||||
typedef typename std::remove_pointer<T>::type X;
|
|
||||||
volatile A t;
|
|
||||||
std::atomic_init(&t, T(1*sizeof(X)));
|
|
||||||
assert(std::atomic_fetch_add(&t, 2) == T(1*sizeof(X)));
|
|
||||||
assert(t == T(3*sizeof(X)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
A(const A& a) : i(a.i) {}
|
|
||||||
A(const volatile A& a) : i(a.i) {}
|
|
||||||
|
|
||||||
void operator=(const volatile A& a) volatile {i = a.i;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void testp()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
typedef std::atomic<T> A;
|
||||||
|
typedef typename std::remove_pointer<T>::type X;
|
||||||
|
A t;
|
||||||
|
std::atomic_init(&t, T(1*sizeof(X)));
|
||||||
|
assert(std::atomic_fetch_add(&t, 2) == T(1*sizeof(X)));
|
||||||
|
assert(t == T(3*sizeof(X)));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef std::atomic<T> A;
|
||||||
|
typedef typename std::remove_pointer<T>::type X;
|
||||||
|
volatile A t;
|
||||||
|
std::atomic_init(&t, T(1*sizeof(X)));
|
||||||
|
assert(std::atomic_fetch_add(&t, 2) == T(1*sizeof(X)));
|
||||||
|
assert(t == T(3*sizeof(X)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
testp<int*>();
|
testp<int*>();
|
||||||
testp<const int*>();
|
testp<const int*>();
|
||||||
}
|
}
|
||||||
|
@ -32,10 +32,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -52,7 +53,8 @@ test()
|
|||||||
std::memory_order_seq_cst) == T(1));
|
std::memory_order_seq_cst) == T(1));
|
||||||
assert(t == T(3));
|
assert(t == T(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
void
|
||||||
@ -78,38 +80,9 @@ testp()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
A(const A& a) : i(a.i) {}
|
|
||||||
A(const volatile A& a) : i(a.i) {}
|
|
||||||
|
|
||||||
void operator=(const volatile A& a) volatile {i = a.i;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
testp<int*>();
|
testp<int*>();
|
||||||
testp<const int*>();
|
testp<const int*>();
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -41,24 +42,10 @@ test()
|
|||||||
assert(std::atomic_fetch_and(&t, T(2)) == T(3));
|
assert(std::atomic_fetch_and(&t, T(2)) == T(3));
|
||||||
assert(t == T(2));
|
assert(t == T(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -43,24 +44,10 @@ test()
|
|||||||
std::memory_order_seq_cst) == T(3));
|
std::memory_order_seq_cst) == T(3));
|
||||||
assert(t == T(2));
|
assert(t == T(2));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -41,24 +42,10 @@ test()
|
|||||||
assert(std::atomic_fetch_or(&t, T(2)) == T(3));
|
assert(std::atomic_fetch_or(&t, T(2)) == T(3));
|
||||||
assert(t == T(3));
|
assert(t == T(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -43,24 +44,10 @@ test()
|
|||||||
std::memory_order_seq_cst) == T(3));
|
std::memory_order_seq_cst) == T(3));
|
||||||
assert(t == T(3));
|
assert(t == T(3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
}
|
}
|
||||||
|
@ -32,10 +32,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -50,62 +51,33 @@ test()
|
|||||||
assert(std::atomic_fetch_sub(&t, T(2)) == T(3));
|
assert(std::atomic_fetch_sub(&t, T(2)) == T(3));
|
||||||
assert(t == T(1));
|
assert(t == T(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
|
||||||
void
|
|
||||||
testp()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
|
||||||
typedef typename std::remove_pointer<T>::type X;
|
|
||||||
A t;
|
|
||||||
std::atomic_init(&t, T(3*sizeof(X)));
|
|
||||||
assert(std::atomic_fetch_sub(&t, 2) == T(3*sizeof(X)));
|
|
||||||
assert(t == T(1*sizeof(X)));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
|
||||||
typedef typename std::remove_pointer<T>::type X;
|
|
||||||
volatile A t;
|
|
||||||
std::atomic_init(&t, T(3*sizeof(X)));
|
|
||||||
assert(std::atomic_fetch_sub(&t, 2) == T(3*sizeof(X)));
|
|
||||||
assert(t == T(1*sizeof(X)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
A(const A& a) : i(a.i) {}
|
|
||||||
A(const volatile A& a) : i(a.i) {}
|
|
||||||
|
|
||||||
void operator=(const volatile A& a) volatile {i = a.i;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void testp()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
typedef std::atomic<T> A;
|
||||||
|
typedef typename std::remove_pointer<T>::type X;
|
||||||
|
A t;
|
||||||
|
std::atomic_init(&t, T(3*sizeof(X)));
|
||||||
|
assert(std::atomic_fetch_sub(&t, 2) == T(3*sizeof(X)));
|
||||||
|
assert(t == T(1*sizeof(X)));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef std::atomic<T> A;
|
||||||
|
typedef typename std::remove_pointer<T>::type X;
|
||||||
|
volatile A t;
|
||||||
|
std::atomic_init(&t, T(3*sizeof(X)));
|
||||||
|
assert(std::atomic_fetch_sub(&t, 2) == T(3*sizeof(X)));
|
||||||
|
assert(t == T(1*sizeof(X)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
testp<int*>();
|
testp<int*>();
|
||||||
testp<const int*>();
|
testp<const int*>();
|
||||||
}
|
}
|
||||||
|
@ -33,10 +33,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -53,64 +54,35 @@ test()
|
|||||||
std::memory_order_seq_cst) == T(3));
|
std::memory_order_seq_cst) == T(3));
|
||||||
assert(t == T(1));
|
assert(t == T(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
|
||||||
void
|
|
||||||
testp()
|
|
||||||
{
|
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
|
||||||
typedef typename std::remove_pointer<T>::type X;
|
|
||||||
A t;
|
|
||||||
std::atomic_init(&t, T(3*sizeof(X)));
|
|
||||||
assert(std::atomic_fetch_sub_explicit(&t, 2,
|
|
||||||
std::memory_order_seq_cst) == T(3*sizeof(X)));
|
|
||||||
assert(t == T(1*sizeof(X)));
|
|
||||||
}
|
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
|
||||||
typedef typename std::remove_pointer<T>::type X;
|
|
||||||
volatile A t;
|
|
||||||
std::atomic_init(&t, T(3*sizeof(X)));
|
|
||||||
assert(std::atomic_fetch_sub_explicit(&t, 2,
|
|
||||||
std::memory_order_seq_cst) == T(3*sizeof(X)));
|
|
||||||
assert(t == T(1*sizeof(X)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
A(const A& a) : i(a.i) {}
|
|
||||||
A(const volatile A& a) : i(a.i) {}
|
|
||||||
|
|
||||||
void operator=(const volatile A& a) volatile {i = a.i;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
void testp()
|
||||||
|
{
|
||||||
|
{
|
||||||
|
typedef std::atomic<T> A;
|
||||||
|
typedef typename std::remove_pointer<T>::type X;
|
||||||
|
A t;
|
||||||
|
std::atomic_init(&t, T(3*sizeof(X)));
|
||||||
|
assert(std::atomic_fetch_sub_explicit(&t, 2,
|
||||||
|
std::memory_order_seq_cst) == T(3*sizeof(X)));
|
||||||
|
assert(t == T(1*sizeof(X)));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
typedef std::atomic<T> A;
|
||||||
|
typedef typename std::remove_pointer<T>::type X;
|
||||||
|
volatile A t;
|
||||||
|
std::atomic_init(&t, T(3*sizeof(X)));
|
||||||
|
assert(std::atomic_fetch_sub_explicit(&t, 2,
|
||||||
|
std::memory_order_seq_cst) == T(3*sizeof(X)));
|
||||||
|
assert(t == T(1*sizeof(X)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
testp<int*>();
|
testp<int*>();
|
||||||
testp<const int*>();
|
testp<const int*>();
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -41,24 +42,10 @@ test()
|
|||||||
assert(std::atomic_fetch_xor(&t, T(2)) == T(3));
|
assert(std::atomic_fetch_xor(&t, T(2)) == T(3));
|
||||||
assert(t == T(1));
|
assert(t == T(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
{
|
{
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
@ -43,24 +44,10 @@ test()
|
|||||||
std::memory_order_seq_cst) == T(3));
|
std::memory_order_seq_cst) == T(3));
|
||||||
assert(t == T(1));
|
assert(t == T(1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<char>();
|
TestEachIntegralType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,51 @@
|
|||||||
|
#ifndef ATOMIC_HELPERS_H
|
||||||
|
#define ATOMIC_HELPERS_H
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "test_macros.h"
|
||||||
|
|
||||||
|
struct UserAtomicType
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
explicit UserAtomicType(int d = 0) TEST_NOEXCEPT : i(d) {}
|
||||||
|
|
||||||
|
friend bool operator==(const UserAtomicType& x, const UserAtomicType& y)
|
||||||
|
{ return x.i == y.i; }
|
||||||
|
};
|
||||||
|
|
||||||
|
template < template <class TestArg> class TestFunctor >
|
||||||
|
struct TestEachIntegralType {
|
||||||
|
void operator()() const {
|
||||||
|
TestFunctor<char>()();
|
||||||
|
TestFunctor<signed char>()();
|
||||||
|
TestFunctor<unsigned char>()();
|
||||||
|
TestFunctor<short>()();
|
||||||
|
TestFunctor<unsigned short>()();
|
||||||
|
TestFunctor<int>()();
|
||||||
|
TestFunctor<unsigned int>()();
|
||||||
|
TestFunctor<long>()();
|
||||||
|
TestFunctor<unsigned long>()();
|
||||||
|
TestFunctor<long long>()();
|
||||||
|
TestFunctor<unsigned long long>()();
|
||||||
|
TestFunctor<wchar_t>();
|
||||||
|
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
||||||
|
TestFunctor<char16_t>()();
|
||||||
|
TestFunctor<char32_t>()();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template < template <class TestArg> class TestFunctor >
|
||||||
|
struct TestEachAtomicType {
|
||||||
|
void operator()() const {
|
||||||
|
TestEachIntegralType<TestFunctor>()();
|
||||||
|
TestFunctor<UserAtomicType>()();
|
||||||
|
TestFunctor<int*>()();
|
||||||
|
TestFunctor<const int*>()();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif // ATOMIC_HELPER_H
|
@ -8,7 +8,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// UNSUPPORTED: libcpp-has-no-threads
|
// UNSUPPORTED: libcpp-has-no-threads
|
||||||
// ... assertion fails line 34
|
// ... assertion fails line 36
|
||||||
|
|
||||||
// <atomic>
|
// <atomic>
|
||||||
|
|
||||||
@ -24,10 +24,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
std::atomic_init(&t, T(1));
|
std::atomic_init(&t, T(1));
|
||||||
@ -35,37 +36,10 @@ test()
|
|||||||
volatile A vt;
|
volatile A vt;
|
||||||
std::atomic_init(&vt, T(2));
|
std::atomic_init(&vt, T(2));
|
||||||
assert(vt == T(2));
|
assert(vt == T(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -22,17 +22,19 @@
|
|||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
bool b1 = std::atomic_is_lock_free(static_cast<const A*>(&t));
|
bool b1 = std::atomic_is_lock_free(static_cast<const A*>(&t));
|
||||||
volatile A vt;
|
volatile A vt;
|
||||||
bool b2 = std::atomic_is_lock_free(static_cast<const volatile A*>(&vt));
|
bool b2 = std::atomic_is_lock_free(static_cast<const volatile A*>(&vt));
|
||||||
assert(b1 == b2);
|
assert(b1 == b2);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
struct A
|
struct A
|
||||||
{
|
{
|
||||||
@ -41,23 +43,6 @@ struct A
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestFn<A>()();
|
||||||
test<char>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// UNSUPPORTED: libcpp-has-no-threads
|
// UNSUPPORTED: libcpp-has-no-threads
|
||||||
// ... assertion fails line 34
|
// ... assertion fails line 35
|
||||||
|
|
||||||
// <atomic>
|
// <atomic>
|
||||||
|
|
||||||
@ -24,10 +24,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
std::atomic_init(&t, T(1));
|
std::atomic_init(&t, T(1));
|
||||||
@ -35,37 +36,10 @@ test()
|
|||||||
volatile A vt;
|
volatile A vt;
|
||||||
std::atomic_init(&vt, T(2));
|
std::atomic_init(&vt, T(2));
|
||||||
assert(std::atomic_load(&vt) == T(2));
|
assert(std::atomic_load(&vt) == T(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -24,10 +24,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
std::atomic_init(&t, T(1));
|
std::atomic_init(&t, T(1));
|
||||||
@ -35,37 +36,10 @@ test()
|
|||||||
volatile A vt;
|
volatile A vt;
|
||||||
std::atomic_init(&vt, T(2));
|
std::atomic_init(&vt, T(2));
|
||||||
assert(std::atomic_load_explicit(&vt, std::memory_order_seq_cst) == T(2));
|
assert(std::atomic_load_explicit(&vt, std::memory_order_seq_cst) == T(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// UNSUPPORTED: libcpp-has-no-threads
|
// UNSUPPORTED: libcpp-has-no-threads
|
||||||
// ... assertion fails line 31
|
|
||||||
|
|
||||||
// <atomic>
|
// <atomic>
|
||||||
|
|
||||||
@ -24,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
std::atomic_store(&t, T(1));
|
std::atomic_store(&t, T(1));
|
||||||
@ -35,37 +35,11 @@ test()
|
|||||||
volatile A vt;
|
volatile A vt;
|
||||||
std::atomic_store(&vt, T(2));
|
std::atomic_store(&vt, T(2));
|
||||||
assert(vt == T(2));
|
assert(vt == T(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// UNSUPPORTED: libcpp-has-no-threads
|
// UNSUPPORTED: libcpp-has-no-threads
|
||||||
// ... assertion fails line 31
|
|
||||||
|
|
||||||
// <atomic>
|
// <atomic>
|
||||||
|
|
||||||
@ -24,10 +23,11 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void
|
struct TestFn {
|
||||||
test()
|
void operator()() const {
|
||||||
{
|
|
||||||
typedef std::atomic<T> A;
|
typedef std::atomic<T> A;
|
||||||
A t;
|
A t;
|
||||||
std::atomic_store_explicit(&t, T(1), std::memory_order_seq_cst);
|
std::atomic_store_explicit(&t, T(1), std::memory_order_seq_cst);
|
||||||
@ -35,37 +35,11 @@ test()
|
|||||||
volatile A vt;
|
volatile A vt;
|
||||||
std::atomic_store_explicit(&vt, T(2), std::memory_order_seq_cst);
|
std::atomic_store_explicit(&vt, T(2), std::memory_order_seq_cst);
|
||||||
assert(vt == T(2));
|
assert(vt == T(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct A
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
explicit A(int d = 0) noexcept {i=d;}
|
|
||||||
|
|
||||||
friend bool operator==(const A& x, const A& y)
|
|
||||||
{return x.i == y.i;}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<A>();
|
TestEachAtomicType<TestFn>()();
|
||||||
test<char>();
|
|
||||||
test<signed char>();
|
|
||||||
test<unsigned char>();
|
|
||||||
test<short>();
|
|
||||||
test<unsigned short>();
|
|
||||||
test<int>();
|
|
||||||
test<unsigned int>();
|
|
||||||
test<long>();
|
|
||||||
test<unsigned long>();
|
|
||||||
test<long long>();
|
|
||||||
test<unsigned long long>();
|
|
||||||
test<wchar_t>();
|
|
||||||
#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<char16_t>();
|
|
||||||
test<char32_t>();
|
|
||||||
#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
|
|
||||||
test<int*>();
|
|
||||||
test<const int*>();
|
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
//
|
//
|
||||||
// UNSUPPORTED: libcpp-has-no-threads
|
// UNSUPPORTED: libcpp-has-no-threads
|
||||||
|
// XFAIL: c++98, c++03
|
||||||
|
|
||||||
// <atomic>
|
// <atomic>
|
||||||
|
|
||||||
|
@ -22,6 +22,8 @@
|
|||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
|
||||||
|
#include "atomic_helpers.h"
|
||||||
|
|
||||||
struct UserType {
|
struct UserType {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -34,27 +36,29 @@ struct UserType {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <class Tp>
|
template <class Tp>
|
||||||
void test() {
|
struct TestFunc {
|
||||||
typedef std::atomic<Tp> Atomic;
|
void operator()() const {
|
||||||
static_assert(std::is_literal_type<Atomic>::value, "");
|
typedef std::atomic<Tp> Atomic;
|
||||||
constexpr Tp t(42);
|
static_assert(std::is_literal_type<Atomic>::value, "");
|
||||||
{
|
constexpr Tp t(42);
|
||||||
constexpr Atomic a(t);
|
{
|
||||||
assert(a == t);
|
constexpr Atomic a(t);
|
||||||
|
assert(a == t);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
constexpr Atomic a{t};
|
||||||
|
assert(a == t);
|
||||||
|
}
|
||||||
|
{
|
||||||
|
constexpr Atomic a = ATOMIC_VAR_INIT(t);
|
||||||
|
assert(a == t);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
{
|
};
|
||||||
constexpr Atomic a{t};
|
|
||||||
assert(a == t);
|
|
||||||
}
|
|
||||||
{
|
|
||||||
constexpr Atomic a = ATOMIC_VAR_INIT(t);
|
|
||||||
assert(a == t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
test<int>();
|
TestFunc<UserType>()();
|
||||||
test<UserType>();
|
TestEachIntegralType<TestFunc>()();
|
||||||
}
|
}
|
||||||
|
@ -62,8 +62,10 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TEST_STD_VER >= 11
|
#if TEST_STD_VER >= 11
|
||||||
|
#define TEST_CONSTEXPR constexpr
|
||||||
#define TEST_NOEXCEPT noexcept
|
#define TEST_NOEXCEPT noexcept
|
||||||
#else
|
#else
|
||||||
|
#define TEST_CONSTEXPR
|
||||||
#define TEST_NOEXCEPT
|
#define TEST_NOEXCEPT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user