]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Test that std::atomic_ref<bool> uses the primary template
authorJonathan Wakely <jwakely@redhat.com>
Thu, 11 Jul 2024 20:23:15 +0000 (21:23 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Thu, 11 Jul 2024 23:08:16 +0000 (00:08 +0100)
The previous commit changed atomic_ref<bool> to not use the integral
specialization. This adds a test to verify that change. We can't
directly test that the primary template is used, but we can check that
the member functions of the integral specializations are not present.

libstdc++-v3/ChangeLog:

* testsuite/29_atomics/atomic_ref/bool.cc: New test.

libstdc++-v3/testsuite/29_atomics/atomic_ref/bool.cc [new file with mode: 0644]

diff --git a/libstdc++-v3/testsuite/29_atomics/atomic_ref/bool.cc b/libstdc++-v3/testsuite/29_atomics/atomic_ref/bool.cc
new file mode 100644 (file)
index 0000000..4702932
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile { target c++20 } }
+
+#include <atomic>
+
+template<class T> concept has_and = requires (T& a) { a &= false; };
+template<class T> concept has_or = requires (T& a) { a |= false; };
+template<class T> concept has_xor = requires (T& a) { a ^= false; };
+template<class T> concept has_fetch_add = requires (T& a) { a.fetch_add(true); };
+template<class T> concept has_fetch_sub = requires (T& a) { a.fetch_sub(true); };
+
+static_assert( not has_and<std::atomic_ref<bool>> );
+static_assert( not has_or<std::atomic_ref<bool>> );
+static_assert( not has_xor<std::atomic_ref<bool>> );
+static_assert( not has_fetch_add<std::atomic_ref<bool>> );
+static_assert( not has_fetch_sub<std::atomic_ref<bool>> );