1//===----------------------------------------------------------------------===//
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//===----------------------------------------------------------------------===//
9//
10// UNSUPPORTED: libcpp-has-no-threads
11//
12// This test uses new symbols that were not defined in the libc++ shipped on
13// darwin11 and darwin12:
14// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
15// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
16
17// <memory>
18
19// shared_ptr
20
21// template <class T>
22// bool
23// atomic_compare_exchange_strong_explicit(shared_ptr<T>* p, shared_ptr<T>* v,
24//                                         shared_ptr<T> w, memory_order success,
25//                                         memory_order failure);
26
27#include <memory>
28#include <cassert>
29
30int main()
31{
32#if __has_feature(cxx_atomic)
33    {
34        std::shared_ptr<int> p(new int(4));
35        std::shared_ptr<int> v(new int(3));
36        std::shared_ptr<int> w(new int(2));
37        bool b = std::atomic_compare_exchange_strong_explicit(&p, &v, w,
38                                                              std::memory_order_seq_cst,
39                                                              std::memory_order_seq_cst);
40        assert(b == false);
41        assert(*p == 4);
42        assert(*v == 4);
43        assert(*w == 2);
44    }
45    {
46        std::shared_ptr<int> p(new int(4));
47        std::shared_ptr<int> v = p;
48        std::shared_ptr<int> w(new int(2));
49        bool b = std::atomic_compare_exchange_strong_explicit(&p, &v, w,
50                                                              std::memory_order_seq_cst,
51                                                              std::memory_order_seq_cst);
52        assert(b == true);
53        assert(*p == 2);
54        assert(*v == 4);
55        assert(*w == 2);
56    }
57#endif
58}
59