aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorNathan Froyd <froydnj@gcc.gnu.org>2013-07-29 17:13:05 +0000
committerNathan Froyd <froydnj@gcc.gnu.org>2013-07-29 17:13:05 +0000
commit272827e446d889b671f76f5b8aa763c0b82384ad (patch)
treeec2d8580f766dcd9a89ba7ed63534b6587a17b3f /libstdc++-v3
parentff3f395157c42a6d2c922de085f5a890834f975b (diff)
downloadgcc-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')
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/include/std/atomic12
-rw-r--r--libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc65
-rw-r--r--libstdc++-v3/testsuite/util/testsuite_common_types.h17
4 files changed, 99 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index d0a494b..edb17ea 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2013-07-29 Nathan Froyd <froydnj@gcc.gnu.org>
+
+ * 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.
+
2013-07-25 Paolo Carlini <paolo.carlini@oracle.com>
* include/std/complex (pow(const complex<>&, int)): Enable in
diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic
index 813f574..2d66729 100644
--- a/libstdc++-v3/include/std/atomic
+++ b/libstdc++-v3/include/std/atomic
@@ -252,12 +252,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
bool
compare_exchange_weak(_Tp& __e, _Tp __i,
memory_order __m = memory_order_seq_cst) noexcept
- { return compare_exchange_weak(__e, __i, __m, __m); }
+ { return compare_exchange_weak(__e, __i, __m,
+ __cmpexch_failure_order(__m)); }
bool
compare_exchange_weak(_Tp& __e, _Tp __i,
memory_order __m = memory_order_seq_cst) volatile noexcept
- { return compare_exchange_weak(__e, __i, __m, __m); }
+ { return compare_exchange_weak(__e, __i, __m,
+ __cmpexch_failure_order(__m)); }
bool
compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s,
@@ -276,12 +278,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
bool
compare_exchange_strong(_Tp& __e, _Tp __i,
memory_order __m = memory_order_seq_cst) noexcept
- { return compare_exchange_strong(__e, __i, __m, __m); }
+ { return compare_exchange_strong(__e, __i, __m,
+ __cmpexch_failure_order(__m)); }
bool
compare_exchange_strong(_Tp& __e, _Tp __i,
memory_order __m = memory_order_seq_cst) volatile noexcept
- { return compare_exchange_strong(__e, __i, __m, __m); }
+ { return compare_exchange_strong(__e, __i, __m,
+ __cmpexch_failure_order(__m)); }
};
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
+}
diff --git a/libstdc++-v3/testsuite/util/testsuite_common_types.h b/libstdc++-v3/testsuite/util/testsuite_common_types.h
index 54d6a75..12e3921 100644
--- a/libstdc++-v3/testsuite/util/testsuite_common_types.h
+++ b/libstdc++-v3/testsuite/util/testsuite_common_types.h
@@ -872,5 +872,22 @@ namespace __gnu_test
= &_Concept::__constraint;
}
};
+
+#if __cplusplus >= 201103L
+ // Generator to test lowering requirements for compare-and-exchange.
+ template<std::memory_order _Torder>
+ struct compare_exchange_order_lowering
+ {
+ template<typename _Tp>
+ void
+ operator()()
+ {
+ std::atomic<_Tp> __x;
+ _Tp __expected = 0;
+ __x.compare_exchange_strong(__expected, 1, _Torder);
+ __x.compare_exchange_weak(__expected, 1, _Torder);
+ }
+ };
+#endif
} // namespace __gnu_test
#endif