15fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//===----------------------------------------------------------------------===//
25fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//
35fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//                     The LLVM Compiler Infrastructure
45fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//
55fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
65fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
75fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//
85fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//===----------------------------------------------------------------------===//
9cedb7fcc10556aaf4302917913c672b1bc6a1db0Daniel Dunbar//
107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// UNSUPPORTED: libcpp-has-no-threads
117112dae6acac544a0271a85d95342c583441e2d1Dan Albert//
12cedb7fcc10556aaf4302917913c672b1bc6a1db0Daniel Dunbar// This test uses new symbols that were not defined in the libc++ shipped on
13cedb7fcc10556aaf4302917913c672b1bc6a1db0Daniel Dunbar// darwin11 and darwin12:
144dc5b2198d1aa4ab585a3d4a87ee9626d681f9f7Dan Albert// XFAIL: with_system_cxx_lib=x86_64-apple-darwin11
154dc5b2198d1aa4ab585a3d4a87ee9626d681f9f7Dan Albert// XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
165fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
175fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// <memory>
185fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
195fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// shared_ptr
205fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
215fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// template <class T>
225fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// bool
235fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// atomic_compare_exchange_weak_explicit(shared_ptr<T>* p, shared_ptr<T>* v,
245fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//                                       shared_ptr<T> w, memory_order success,
255fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant//                                       memory_order failure);
265fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
275fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#include <memory>
285fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#include <cassert>
295fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
305fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnantint main()
315fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant{
325fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#if __has_feature(cxx_atomic)
335fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant    {
345fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> p(new int(4));
355fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> v(new int(3));
365fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> w(new int(2));
375fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        bool b = std::atomic_compare_exchange_weak_explicit(&p, &v, w,
385fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant                                                            std::memory_order_seq_cst,
395fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant                                                            std::memory_order_seq_cst);
405fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(b == false);
415fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*p == 4);
425fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*v == 4);
435fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*w == 2);
445fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant    }
455fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant    {
465fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> p(new int(4));
475fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> v = p;
485fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> w(new int(2));
495fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        bool b = std::atomic_compare_exchange_weak_explicit(&p, &v, w,
505fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant                                                            std::memory_order_seq_cst,
515fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant                                                            std::memory_order_seq_cst);
525fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(b == true);
535fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*p == 2);
545fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*v == 4);
555fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*w == 2);
565fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant    }
575fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#endif
585fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant}
59