diff options
author | Nathan Froyd <froydnj@gcc.gnu.org> | 2013-07-29 17:13:05 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2013-07-29 17:13:05 +0000 |
commit | 272827e446d889b671f76f5b8aa763c0b82384ad (patch) | |
tree | ec2d8580f766dcd9a89ba7ed63534b6587a17b3f /libstdc++-v3/testsuite/29_atomics | |
parent | ff3f395157c42a6d2c922de085f5a890834f975b (diff) | |
download | gcc-272827e446d889b671f76f5b8aa763c0b82384ad.zip gcc-272827e446d889b671f76f5b8aa763c0b82384ad.tar.gz gcc-272827e446d889b671f76f5b8aa763c0b82384ad.tar.bz2 |
atomic (compare_exchange_weak, [...]): Add call to __cmpexch_failure_order.
libstdc++-v3/
* include/std/atomic (compare_exchange_weak, compare_exchange_strong):
Add call to __cmpexch_failure_order.
* testsuite/util/testsuite_common_types.h
(compare_exchange_order_lowering): New generator.
* testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc:
New test.
From-SVN: r201315
Diffstat (limited to 'libstdc++-v3/testsuite/29_atomics')
-rw-r--r-- | libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc b/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc new file mode 100644 index 0000000..7e5d58f --- /dev/null +++ b/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc @@ -0,0 +1,65 @@ +// { dg-options "-std=gnu++11" } +// { dg-do compile } + +// Copyright (C) 2013 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// <http://www.gnu.org/licenses/>. + +#include <atomic> +#include <testsuite_common_types.h> + +#define TEST_ALL_ORDERS() \ + do { \ + ORDER_TEST(std::memory_order_relaxed); \ + ORDER_TEST(std::memory_order_consume); \ + ORDER_TEST(std::memory_order_acquire); \ + ORDER_TEST(std::memory_order_release); \ + ORDER_TEST(std::memory_order_acq_rel); \ + ORDER_TEST(std::memory_order_seq_cst); \ + } while(0) + +void test01() +{ +#define ORDER_TEST(ORDER) \ + do { \ + __gnu_test::compare_exchange_order_lowering<ORDER> test; \ + __gnu_cxx::typelist::apply_generator(test, \ + __gnu_test::integral_types::type()); \ + } while (0); + TEST_ALL_ORDERS(); +#undef ORDER_TEST + + enum e { a, b, c }; +#define ORDER_TEST(ORDER) \ + do { \ + std::atomic<e> x(a); \ + e expected = a; \ + x.compare_exchange_strong(expected, b, ORDER); \ + x.compare_exchange_weak(expected, c, ORDER); \ + } while (0); + TEST_ALL_ORDERS(); +#undef ORDER_TEST + +#define ORDER_TEST(ORDER) \ + do { \ + std::atomic<void*> x(nullptr); \ + void* expected = nullptr; \ + x.compare_exchange_strong(expected, nullptr, ORDER); \ + x.compare_exchange_weak(expected, nullptr, ORDER); \ + } while (0); + TEST_ALL_ORDERS(); +#undef ORDER_TEST +} |