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//
10cedb7fcc10556aaf4302917913c672b1bc6a1db0Daniel Dunbar// This test uses new symbols that were not defined in the libc++ shipped on
11cedb7fcc10556aaf4302917913c672b1bc6a1db0Daniel Dunbar// darwin11 and darwin12:
12cedb7fcc10556aaf4302917913c672b1bc6a1db0Daniel Dunbar// XFAIL: with_system_lib=x86_64-apple-darwin11
13cedb7fcc10556aaf4302917913c672b1bc6a1db0Daniel Dunbar// XFAIL: with_system_lib=x86_64-apple-darwin12
145fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
155fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// <memory>
165fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
175fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// shared_ptr
185fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
195fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// template <class T>
205fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// shared_ptr<T>
215fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant// atomic_exchange_explicit(shared_ptr<T>* p, shared_ptr<T> r)
225fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
235fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#include <memory>
245fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#include <cassert>
255fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant
265fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnantint main()
275fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant{
285fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#if __has_feature(cxx_atomic)
295fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant    {
305fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> p(new int(4));
315fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        std::shared_ptr<int> r(new int(3));
325fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        r = std::atomic_exchange_explicit(&p, r, std::memory_order_seq_cst);
335fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*p == 3);
345fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant        assert(*r == 4);
355fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant    }
365fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant#endif
375fec82dc0db3623546038e4a86baa44f749e554fHoward Hinnant}
38