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