blob: 46f80bfbcb7bf58d67d438af06c4fdd37e542403 [file] [log] [blame]
Howard Hinnant4777bf22010-12-06 23:10:08 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Jonathan Roelofs8d86b2e2014-09-05 19:45:05 +00009//
10// UNSUPPORTED: libcpp-has-no-threads
11// ... assertion fails line 38
Howard Hinnant4777bf22010-12-06 23:10:08 +000012
13// <atomic>
14
15// template <class T>
16// bool
17// atomic_compare_exchange_weak_explicit(volatile atomic<T>* obj, T* expc,
18// T desr,
19// memory_order s, memory_order f);
20//
21// template <class T>
22// bool
23// atomic_compare_exchange_weak_explicit(atomic<T>* obj, T* expc, T desr,
24// memory_order s, memory_order f);
25
26#include <atomic>
Richard Smith9efdc0b2012-04-19 00:50:47 +000027#include <type_traits>
Howard Hinnant4777bf22010-12-06 23:10:08 +000028#include <cassert>
29
Dan Albert7ba3c572014-09-06 20:38:25 +000030#include <cmpxchg_loop.h>
31
Howard Hinnant4777bf22010-12-06 23:10:08 +000032template <class T>
Dan Albert1d4a1ed2016-05-25 22:36:09 -070033void
34test()
35{
Howard Hinnant4777bf22010-12-06 23:10:08 +000036 {
37 typedef std::atomic<T> A;
38 A a;
39 T t(T(1));
40 std::atomic_init(&a, t);
Dan Albert7ba3c572014-09-06 20:38:25 +000041 assert(c_cmpxchg_weak_loop(&a, &t, T(2),
Howard Hinnant4777bf22010-12-06 23:10:08 +000042 std::memory_order_seq_cst, std::memory_order_seq_cst) == true);
43 assert(a == T(2));
44 assert(t == T(1));
45 assert(std::atomic_compare_exchange_weak_explicit(&a, &t, T(3),
46 std::memory_order_seq_cst, std::memory_order_seq_cst) == false);
47 assert(a == T(2));
David Chisnalld3eca752012-04-05 13:48:16 +000048 assert(t == T(2));
Howard Hinnant4777bf22010-12-06 23:10:08 +000049 }
50 {
51 typedef std::atomic<T> A;
52 volatile A a;
53 T t(T(1));
54 std::atomic_init(&a, t);
Dan Albert7ba3c572014-09-06 20:38:25 +000055 assert(c_cmpxchg_weak_loop(&a, &t, T(2),
Howard Hinnant4777bf22010-12-06 23:10:08 +000056 std::memory_order_seq_cst, std::memory_order_seq_cst) == true);
57 assert(a == T(2));
58 assert(t == T(1));
59 assert(std::atomic_compare_exchange_weak_explicit(&a, &t, T(3),
60 std::memory_order_seq_cst, std::memory_order_seq_cst) == false);
61 assert(a == T(2));
David Chisnalld3eca752012-04-05 13:48:16 +000062 assert(t == T(2));
Howard Hinnant4777bf22010-12-06 23:10:08 +000063 }
Dan Albert1d4a1ed2016-05-25 22:36:09 -070064}
65
66struct A
67{
68 int i;
69
70 explicit A(int d = 0) noexcept {i=d;}
71
72 friend bool operator==(const A& x, const A& y)
73 {return x.i == y.i;}
Howard Hinnant4777bf22010-12-06 23:10:08 +000074};
75
76int main()
77{
Dan Albert1d4a1ed2016-05-25 22:36:09 -070078 test<A>();
79 test<char>();
80 test<signed char>();
81 test<unsigned char>();
82 test<short>();
83 test<unsigned short>();
84 test<int>();
85 test<unsigned int>();
86 test<long>();
87 test<unsigned long>();
88 test<long long>();
89 test<unsigned long long>();
90 test<wchar_t>();
91#ifndef _LIBCPP_HAS_NO_UNICODE_CHARS
92 test<char16_t>();
93 test<char32_t>();
94#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
95 test<int*>();
96 test<const int*>();
Howard Hinnant4777bf22010-12-06 23:10:08 +000097}