blob: 4d66bb5f3b8124c3e228d64421fd6f0c8c01d29f [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 32
Howard Hinnant4777bf22010-12-06 23:10:08 +000012
13// <atomic>
14
15// template <class T>
16// T
17// atomic_exchange_explicit(volatile atomic<T>* obj, T desr, memory_order m);
18//
19// template <class T>
20// T
21// atomic_exchange_explicit(atomic<T>* obj, T desr, memory_order m);
22
23#include <atomic>
Richard Smith9efdc0b2012-04-19 00:50:47 +000024#include <type_traits>
Howard Hinnant4777bf22010-12-06 23:10:08 +000025#include <cassert>
26
Eric Fiselier00f4a492015-08-19 17:21:46 +000027#include "atomic_helpers.h"
28
Howard Hinnant4777bf22010-12-06 23:10:08 +000029template <class T>
Eric Fiselier00f4a492015-08-19 17:21:46 +000030struct TestFn {
31 void operator()() const {
Howard Hinnant4777bf22010-12-06 23:10:08 +000032 typedef std::atomic<T> A;
33 A t;
34 std::atomic_init(&t, T(1));
35 assert(std::atomic_exchange_explicit(&t, T(2), std::memory_order_seq_cst)
36 == T(1));
37 assert(t == T(2));
38 volatile A vt;
39 std::atomic_init(&vt, T(3));
40 assert(std::atomic_exchange_explicit(&vt, T(4), std::memory_order_seq_cst)
41 == T(3));
42 assert(vt == T(4));
Eric Fiselier00f4a492015-08-19 17:21:46 +000043 }
Howard Hinnant4777bf22010-12-06 23:10:08 +000044};
45
Eric Fiselier00f4a492015-08-19 17:21:46 +000046
Howard Hinnant4777bf22010-12-06 23:10:08 +000047int main()
48{
Eric Fiselier00f4a492015-08-19 17:21:46 +000049 TestEachAtomicType<TestFn>()();
Howard Hinnant4777bf22010-12-06 23:10:08 +000050}