diff options
author | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
---|---|---|
committer | Eric Fiselier <eric@efcs.ca> | 2014-12-20 01:40:03 +0000 |
commit | a90c6dd46005b2b14de3bb889a8d03bb34bd3256 (patch) | |
tree | 81065ae44967d68964de1f2fdfa107623e58e8a4 /test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp | |
parent | 669a8a5a1929e881258bfed10d7461ca42ea0a9e (diff) | |
download | external_libcxx-a90c6dd46005b2b14de3bb889a8d03bb34bd3256.tar.gz external_libcxx-a90c6dd46005b2b14de3bb889a8d03bb34bd3256.tar.bz2 external_libcxx-a90c6dd46005b2b14de3bb889a8d03bb34bd3256.zip |
Move test into test/std subdirectory.
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@224658 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp')
-rw-r--r-- | test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp b/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp new file mode 100644 index 000000000..9977bd491 --- /dev/null +++ b/test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp @@ -0,0 +1,115 @@ +//===----------------------------------------------------------------------===// +// +// 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 +// ... test crashes clang + +// <atomic> + +// template <class Integral> +// Integral +// atomic_fetch_add_explicit(volatile atomic<Integral>* obj, Integral op, +// memory_order m); +// template <class Integral> +// Integral +// atomic_fetch_add_explicit(atomic<Integral>* obj, Integral op, +// memory_order m); +// template <class T> +// T* +// atomic_fetch_add_explicit(volatile atomic<T*>* obj, ptrdiff_t op, +// memory_order m); +// template <class T> +// T* +// atomic_fetch_add_explicit(atomic<T*>* obj, ptrdiff_t op, memory_order m); + +#include <atomic> +#include <type_traits> +#include <cassert> + +template <class T> +void +test() +{ + { + typedef std::atomic<T> A; + A t; + std::atomic_init(&t, T(1)); + assert(std::atomic_fetch_add_explicit(&t, T(2), + std::memory_order_seq_cst) == T(1)); + assert(t == T(3)); + } + { + typedef std::atomic<T> A; + volatile A t; + std::atomic_init(&t, T(1)); + assert(std::atomic_fetch_add_explicit(&t, T(2), + std::memory_order_seq_cst) == T(1)); + 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_explicit(&t, 2, + std::memory_order_seq_cst) == 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_explicit(&t, 2, + std::memory_order_seq_cst) == 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;} +}; + +int main() +{ + 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 + testp<int*>(); + testp<const int*>(); +} |