* [PATCH] Add feature test macro for atomic<T>::wait
@ 2020-11-30 18:17 Thomas Rodgers
2020-12-01 14:52 ` Jonathan Wakely
0 siblings, 1 reply; 4+ messages in thread
From: Thomas Rodgers @ 2020-11-30 18:17 UTC (permalink / raw)
To: gcc-patches, libstdc++; +Cc: trodgers
From: Thomas Rodgers <trodgers@redhat.com>
Adds __cpp_lib_atomic_wait feature test macro which was overlooked in
the initial commit of this feature. Replaces uses of
_GLIBCXX_HAVE_ATOMIC_WAIT.
libstdc++-v3/ChangeLog:
* include/bits/atomic_base.h: Replace usage of
_GLIBCXX_HAVE_ATOMIC_WAIT with __cpp_lib_atomic_wait.
* include/bits/atomic_timed_wait.h: Likewise.
* include/bits/atomic_wait.h: Define __cpp_lib_atomic_wait
feature test macro.
* include/bits/semaphore_base: Replace usage of
_GLIBCXX_HAVE_ATOMIC_WAIT with __cpp_lib_atomic_wait.
* include/std/atomic: Likewise.
* include/std/latch: Likewise.
* include/std/semaphore: Likewise.
* include/std/version: Define __cpp_lib_atomic wait
feature test macro and replace usage of
_GLIBCXX_HAVE_ATOMIC_WAIT.
* testsuite/29_atomics/atomic/wait_notify/1.cc: New test.
* testsuite/29_atomics/atomic/wait_notify/2.cc: Likewise.
---
libstdc++-v3/include/bits/atomic_base.h | 36 +++++++++----------
libstdc++-v3/include/bits/atomic_timed_wait.h | 5 +--
libstdc++-v3/include/bits/atomic_wait.h | 3 +-
libstdc++-v3/include/bits/semaphore_base.h | 4 +--
libstdc++-v3/include/std/atomic | 16 ++++-----
libstdc++-v3/include/std/latch | 4 +--
libstdc++-v3/include/std/semaphore | 4 +--
libstdc++-v3/include/std/version | 7 ++--
.../29_atomics/atomic/wait_notify/1.cc | 28 +++++++++++++++
.../29_atomics/atomic/wait_notify/2.cc | 29 +++++++++++++++
10 files changed, 98 insertions(+), 38 deletions(-)
create mode 100644 libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
create mode 100644 libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h
index d0d962d3047..ad4e24b4d20 100644
--- a/libstdc++-v3/include/bits/atomic_base.h
+++ b/libstdc++-v3/include/bits/atomic_base.h
@@ -230,7 +230,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return __v == __GCC_ATOMIC_TEST_AND_SET_TRUEVAL;
}
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(bool __old,
memory_order __m = memory_order_seq_cst) const noexcept
@@ -253,7 +253,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ std::__atomic_notify(&_M_i, true); }
// TODO add const volatile overload
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
#endif // C++20
_GLIBCXX_ALWAYS_INLINE void
@@ -604,7 +604,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__cmpexch_failure_order(__m));
}
-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
+#if __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(__int_type __old,
memory_order __m = memory_order_seq_cst) const noexcept
@@ -627,7 +627,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ std::__atomic_notify(&_M_i, true); }
// TODO add const volatile overload
-#endif // C++20 && HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE __int_type
fetch_add(__int_type __i,
@@ -898,7 +898,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
int(__m1), int(__m2));
}
-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
+#if __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(__pointer_type __old,
memory_order __m = memory_order_seq_cst) noexcept
@@ -921,7 +921,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ std::__atomic_notify(&_M_p, true); }
// TODO add const volatile overload
-#endif // C++20 && HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE __pointer_type
fetch_add(ptrdiff_t __d,
@@ -1011,7 +1011,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
int(__success), int(__failure));
}
-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
+#if __cpp_lib_atomic_wait
template<typename _Tp>
_GLIBCXX_ALWAYS_INLINE void
wait(const _Tp* __ptr, _Val<_Tp> __old,
@@ -1036,7 +1036,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ std::__atomic_notify(__ptr, true); }
// TODO add const volatile overload
-#endif // C++20 && HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
template<typename _Tp>
_GLIBCXX_ALWAYS_INLINE _Tp
@@ -1291,7 +1291,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__cmpexch_failure_order(__order));
}
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
{ __atomic_impl::wait(&_M_fp, __old, __m); }
@@ -1309,7 +1309,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ __atomic_impl::notify_all(&_M_fp); }
// TODO add const volatile overload
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
value_type
fetch_add(value_type __i,
@@ -1448,7 +1448,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__cmpexch_failure_order(__order));
}
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
{ __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1466,7 +1466,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ __atomic_impl::notify_all(_M_ptr); }
// TODO add const volatile overload
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
private:
_Tp* _M_ptr;
@@ -1563,7 +1563,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__cmpexch_failure_order(__order));
}
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
{ __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1581,7 +1581,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ __atomic_impl::notify_all(_M_ptr); }
// TODO add const volatile overload
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
value_type
fetch_add(value_type __i,
@@ -1738,7 +1738,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__cmpexch_failure_order(__order));
}
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
{ __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1756,7 +1756,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ __atomic_impl::notify_all(_M_ptr); }
// TODO add const volatile overload
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
value_type
fetch_add(value_type __i,
@@ -1867,7 +1867,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__cmpexch_failure_order(__order));
}
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE void
wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
{ __atomic_impl::wait(_M_ptr, __old, __m); }
@@ -1885,7 +1885,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ __atomic_impl::notify_all(_M_ptr); }
// TODO add const volatile overload
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
_GLIBCXX_ALWAYS_INLINE value_type
fetch_add(difference_type __d,
diff --git a/libstdc++-v3/include/bits/atomic_timed_wait.h b/libstdc++-v3/include/bits/atomic_timed_wait.h
index f3a07a36722..6dd1a145e69 100644
--- a/libstdc++-v3/include/bits/atomic_timed_wait.h
+++ b/libstdc++-v3/include/bits/atomic_timed_wait.h
@@ -33,7 +33,8 @@
#pragma GCC system_header
#include <bits/atomic_wait.h>
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+
+#ifdef __cpp_lib_atomic_wait
#include <bits/functional_hash.h>
#include <chrono>
@@ -292,5 +293,5 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
#endif // _GLIBCXX_ATOMIC_TIMED_WAIT_H
diff --git a/libstdc++-v3/include/bits/atomic_wait.h b/libstdc++-v3/include/bits/atomic_wait.h
index a59ed8cb418..5efd96d22a1 100644
--- a/libstdc++-v3/include/bits/atomic_wait.h
+++ b/libstdc++-v3/include/bits/atomic_wait.h
@@ -50,8 +50,7 @@
# include <bits/std_mutex.h> // std::mutex, std::__condvar
#endif
-// Other headers use this to check for the facilities defined in this header.
-#define _GLIBCXX_HAVE_ATOMIC_WAIT 1
+#define __cpp_lib_atomic_wait 201907L
namespace std _GLIBCXX_VISIBILITY(default)
{
diff --git a/libstdc++-v3/include/bits/semaphore_base.h b/libstdc++-v3/include/bits/semaphore_base.h
index f2984236e03..0ed1f5895af 100644
--- a/libstdc++-v3/include/bits/semaphore_base.h
+++ b/libstdc++-v3/include/bits/semaphore_base.h
@@ -33,7 +33,7 @@
#pragma GCC system_header
#include <bits/atomic_base.h>
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
#include <bits/atomic_timed_wait.h>
#include <ext/numeric_traits.h>
@@ -297,5 +297,5 @@ template<ptrdiff_t __least_max_value>
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
#endif // _GLIBCXX_SEMAPHORE_BASE_H
diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic
index 664af023d77..4a9b00182a3 100644
--- a/libstdc++-v3/include/std/atomic
+++ b/libstdc++-v3/include/std/atomic
@@ -164,7 +164,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
memory_order __m = memory_order_seq_cst) volatile noexcept
{ return _M_base.compare_exchange_strong(__i1, __i2, __m); }
-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
+#if __cpp_lib_atomic_wait
void
wait(bool __old, memory_order __m = memory_order_seq_cst) const noexcept
{ _M_base.wait(__old, __m); }
@@ -178,7 +178,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
notify_all() const noexcept
{ _M_base.notify_all(); }
-#endif // C++20 && HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
};
#if __cplusplus <= 201703L
@@ -380,7 +380,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{ return compare_exchange_strong(__e, __i, __m,
__cmpexch_failure_order(__m)); }
-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
+#if __cpp_lib_atomic_wait
void
wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
{
@@ -404,7 +404,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
notify_all() const noexcept
{ std::__atomic_notify(&_M_i, true); }
-#endif // C++20 && HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
};
#undef _GLIBCXX20_INIT
@@ -644,7 +644,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
__cmpexch_failure_order(__m));
}
-#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
+#if __cpp_lib_atomic_wait
void
wait(__pointer_type __old, memory_order __m = memory_order_seq_cst) noexcept
{ _M_b.wait(__old, __m); }
@@ -658,7 +658,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
void
notify_all() const noexcept
{ _M_b.notify_all(); }
-#endif // C++20 && HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
__pointer_type
fetch_add(ptrdiff_t __d,
memory_order __m = memory_order_seq_cst) noexcept
@@ -1412,7 +1412,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
-#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
+#if __cpp_lib_atomic_wait
template<typename _Tp>
inline void
atomic_wait(const atomic<_Tp>* __a,
@@ -1435,7 +1435,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
inline void
atomic_notify_all(atomic<_Tp>* __a) noexcept
{ __a->notify_all(); }
-#endif // C++20 && HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
// Function templates for atomic_integral and atomic_pointer operations only.
// Some operations (and, or, xor) are only available for atomic integrals,
diff --git a/libstdc++-v3/include/std/latch b/libstdc++-v3/include/std/latch
index 2684b72288f..3ae77cb1cd2 100644
--- a/libstdc++-v3/include/std/latch
+++ b/libstdc++-v3/include/std/latch
@@ -36,7 +36,7 @@
#include <bits/atomic_base.h>
#include <ext/numeric_traits.h>
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
namespace std _GLIBCXX_VISIBILITY(default)
{
_GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -89,6 +89,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
};
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
#endif // __cplusplus > 201703L
#endif // _GLIBCXX_LATCH
diff --git a/libstdc++-v3/include/std/semaphore b/libstdc++-v3/include/std/semaphore
index 184c7c2867c..0ecf3bf2fa0 100644
--- a/libstdc++-v3/include/std/semaphore
+++ b/libstdc++-v3/include/std/semaphore
@@ -33,7 +33,7 @@
#if __cplusplus > 201703L
#include <bits/semaphore_base.h>
-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
+#ifdef __cpp_lib_atomic_wait
#include <ext/numeric_traits.h>
namespace std _GLIBCXX_VISIBILITY(default)
@@ -90,6 +90,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
using binary_semaphore = std::counting_semaphore<1>;
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace
-#endif // HAVE_ATOMIC_WAIT
+#endif // __cpp_lib_atomic_wait
#endif // C++20
#endif // _GLIBCXX_SEMAPHORE
diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version
index 0f2da8a5ddd..e5502c9e84b 100644
--- a/libstdc++-v3/include/std/version
+++ b/libstdc++-v3/include/std/version
@@ -197,6 +197,9 @@
#if _GLIBCXX_HOSTED
#define __cpp_lib_array_constexpr 201811L
#define __cpp_lib_assume_aligned 201811L
+#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
+#define __cpp_lib_atomic_wait 201907L
+#endif
#define __cpp_lib_bind_front 201907L
// FIXME: #define __cpp_lib_execution 201902L
#define __cpp_lib_integer_comparison_functions 202002L
@@ -216,7 +219,7 @@
#ifdef _GLIBCXX_HAS_GTHREADS
# define __cpp_lib_jthread 201911L
#endif
-#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
+#if defined __cpp_lib_atomic_wait
# define __cpp_lib_latch 201907L
#endif
#define __cpp_lib_list_remove_return_type 201806L
@@ -228,7 +231,7 @@
#if __cpp_lib_concepts
# define __cpp_lib_ranges 201911L
#endif
-#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
+#if defined __cpp_lib_atomic_wait
# define __cpp_lib_semaphore 201907L
#endif
#define __cpp_lib_shift 201806L
diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
new file mode 100644
index 00000000000..5a08d64c1f0
--- /dev/null
+++ b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
@@ -0,0 +1,28 @@
+// Copyright (C) 2020 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/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <atomic>
+
+#ifndef __cpp_lib_atomic_wait
+# error "Feature-test macro for atomic wait missing in <atomic>"
+#elif __cpp_lib_atomic_wait != 201907L
+# error "Feature-test macro for atomic wait has wrong value in <atomic>"
+#endif
+
diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
new file mode 100644
index 00000000000..5031a369e79
--- /dev/null
+++ b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
@@ -0,0 +1,29 @@
+// Copyright (C) 2020 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/>.
+
+// { dg-options "-std=gnu++2a" }
+// { dg-do compile { target c++2a } }
+
+#include <version>
+
+#ifndef __cpp_lib_atomic_wait
+# error "Feature-test macro for atomic wait missing in <version>"
+#elif __cpp_lib_atomic_wait != 201907L
+# error "Feature-test macro for atomic wait has wrong value in <version>"
+#endif
+
+
--
2.26.2
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Add feature test macro for atomic<T>::wait
2020-11-30 18:17 [PATCH] Add feature test macro for atomic<T>::wait Thomas Rodgers
@ 2020-12-01 14:52 ` Jonathan Wakely
2020-12-01 23:45 ` Thomas Rodgers
0 siblings, 1 reply; 4+ messages in thread
From: Jonathan Wakely @ 2020-12-01 14:52 UTC (permalink / raw)
To: Thomas Rodgers; +Cc: gcc-patches, libstdc++, trodgers
On 30/11/20 10:17 -0800, Thomas Rodgers wrote:
>From: Thomas Rodgers <trodgers@redhat.com>
>
>Adds __cpp_lib_atomic_wait feature test macro which was overlooked in
>the initial commit of this feature. Replaces uses of
>_GLIBCXX_HAVE_ATOMIC_WAIT.
>
>libstdc++-v3/ChangeLog:
>
> * include/bits/atomic_base.h: Replace usage of
> _GLIBCXX_HAVE_ATOMIC_WAIT with __cpp_lib_atomic_wait.
> * include/bits/atomic_timed_wait.h: Likewise.
> * include/bits/atomic_wait.h: Define __cpp_lib_atomic_wait
> feature test macro.
> * include/bits/semaphore_base: Replace usage of
> _GLIBCXX_HAVE_ATOMIC_WAIT with __cpp_lib_atomic_wait.
> * include/std/atomic: Likewise.
> * include/std/latch: Likewise.
> * include/std/semaphore: Likewise.
> * include/std/version: Define __cpp_lib_atomic wait
> feature test macro and replace usage of
> _GLIBCXX_HAVE_ATOMIC_WAIT.
> * testsuite/29_atomics/atomic/wait_notify/1.cc: New test.
> * testsuite/29_atomics/atomic/wait_notify/2.cc: Likewise.
>
>---
> libstdc++-v3/include/bits/atomic_base.h | 36 +++++++++----------
> libstdc++-v3/include/bits/atomic_timed_wait.h | 5 +--
> libstdc++-v3/include/bits/atomic_wait.h | 3 +-
> libstdc++-v3/include/bits/semaphore_base.h | 4 +--
> libstdc++-v3/include/std/atomic | 16 ++++-----
> libstdc++-v3/include/std/latch | 4 +--
> libstdc++-v3/include/std/semaphore | 4 +--
> libstdc++-v3/include/std/version | 7 ++--
> .../29_atomics/atomic/wait_notify/1.cc | 28 +++++++++++++++
> .../29_atomics/atomic/wait_notify/2.cc | 29 +++++++++++++++
> 10 files changed, 98 insertions(+), 38 deletions(-)
> create mode 100644 libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
> create mode 100644 libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
>
>diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h
>index d0d962d3047..ad4e24b4d20 100644
>--- a/libstdc++-v3/include/bits/atomic_base.h
>+++ b/libstdc++-v3/include/bits/atomic_base.h
>@@ -230,7 +230,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> return __v == __GCC_ATOMIC_TEST_AND_SET_TRUEVAL;
> }
>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
I've not always been consistent about using #if or #ifdef for
__cpp_lib macros, but let's not make that worse in a single patch. I
think we should just use #if for __cpp_lib macros. That affects
several places in the patch.
> _GLIBCXX_ALWAYS_INLINE void
> wait(bool __old,
> memory_order __m = memory_order_seq_cst) const noexcept
>@@ -253,7 +253,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { std::__atomic_notify(&_M_i, true); }
>
> // TODO add const volatile overload
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
> #endif // C++20
>
> _GLIBCXX_ALWAYS_INLINE void
>@@ -604,7 +604,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> __cmpexch_failure_order(__m));
> }
>
>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>+#if __cpp_lib_atomic_wait
> _GLIBCXX_ALWAYS_INLINE void
> wait(__int_type __old,
> memory_order __m = memory_order_seq_cst) const noexcept
>@@ -627,7 +627,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { std::__atomic_notify(&_M_i, true); }
>
> // TODO add const volatile overload
>-#endif // C++20 && HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> _GLIBCXX_ALWAYS_INLINE __int_type
> fetch_add(__int_type __i,
>@@ -898,7 +898,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> int(__m1), int(__m2));
> }
>
>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>+#if __cpp_lib_atomic_wait
> _GLIBCXX_ALWAYS_INLINE void
> wait(__pointer_type __old,
> memory_order __m = memory_order_seq_cst) noexcept
>@@ -921,7 +921,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { std::__atomic_notify(&_M_p, true); }
>
> // TODO add const volatile overload
>-#endif // C++20 && HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> _GLIBCXX_ALWAYS_INLINE __pointer_type
> fetch_add(ptrdiff_t __d,
>@@ -1011,7 +1011,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> int(__success), int(__failure));
> }
>
>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>+#if __cpp_lib_atomic_wait
> template<typename _Tp>
> _GLIBCXX_ALWAYS_INLINE void
> wait(const _Tp* __ptr, _Val<_Tp> __old,
>@@ -1036,7 +1036,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { std::__atomic_notify(__ptr, true); }
>
> // TODO add const volatile overload
>-#endif // C++20 && HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> template<typename _Tp>
> _GLIBCXX_ALWAYS_INLINE _Tp
>@@ -1291,7 +1291,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> __cmpexch_failure_order(__order));
> }
>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
> _GLIBCXX_ALWAYS_INLINE void
> wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
> { __atomic_impl::wait(&_M_fp, __old, __m); }
>@@ -1309,7 +1309,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { __atomic_impl::notify_all(&_M_fp); }
>
> // TODO add const volatile overload
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> value_type
> fetch_add(value_type __i,
>@@ -1448,7 +1448,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> __cmpexch_failure_order(__order));
> }
>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
> _GLIBCXX_ALWAYS_INLINE void
> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
> { __atomic_impl::wait(_M_ptr, __old, __m); }
>@@ -1466,7 +1466,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { __atomic_impl::notify_all(_M_ptr); }
>
> // TODO add const volatile overload
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> private:
> _Tp* _M_ptr;
>@@ -1563,7 +1563,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> __cmpexch_failure_order(__order));
> }
>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
> _GLIBCXX_ALWAYS_INLINE void
> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
> { __atomic_impl::wait(_M_ptr, __old, __m); }
>@@ -1581,7 +1581,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { __atomic_impl::notify_all(_M_ptr); }
>
> // TODO add const volatile overload
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> value_type
> fetch_add(value_type __i,
>@@ -1738,7 +1738,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> __cmpexch_failure_order(__order));
> }
>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
> _GLIBCXX_ALWAYS_INLINE void
> wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
> { __atomic_impl::wait(_M_ptr, __old, __m); }
>@@ -1756,7 +1756,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { __atomic_impl::notify_all(_M_ptr); }
>
> // TODO add const volatile overload
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> value_type
> fetch_add(value_type __i,
>@@ -1867,7 +1867,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> __cmpexch_failure_order(__order));
> }
>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
> _GLIBCXX_ALWAYS_INLINE void
> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
> { __atomic_impl::wait(_M_ptr, __old, __m); }
>@@ -1885,7 +1885,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { __atomic_impl::notify_all(_M_ptr); }
>
> // TODO add const volatile overload
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> _GLIBCXX_ALWAYS_INLINE value_type
> fetch_add(difference_type __d,
>diff --git a/libstdc++-v3/include/bits/atomic_timed_wait.h b/libstdc++-v3/include/bits/atomic_timed_wait.h
>index f3a07a36722..6dd1a145e69 100644
>--- a/libstdc++-v3/include/bits/atomic_timed_wait.h
>+++ b/libstdc++-v3/include/bits/atomic_timed_wait.h
>@@ -33,7 +33,8 @@
> #pragma GCC system_header
>
> #include <bits/atomic_wait.h>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+
>+#ifdef __cpp_lib_atomic_wait
> #include <bits/functional_hash.h>
>
> #include <chrono>
>@@ -292,5 +293,5 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> }
> _GLIBCXX_END_NAMESPACE_VERSION
> } // namespace std
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
> #endif // _GLIBCXX_ATOMIC_TIMED_WAIT_H
>diff --git a/libstdc++-v3/include/bits/atomic_wait.h b/libstdc++-v3/include/bits/atomic_wait.h
>index a59ed8cb418..5efd96d22a1 100644
>--- a/libstdc++-v3/include/bits/atomic_wait.h
>+++ b/libstdc++-v3/include/bits/atomic_wait.h
>@@ -50,8 +50,7 @@
> # include <bits/std_mutex.h> // std::mutex, std::__condvar
> #endif
>
>-// Other headers use this to check for the facilities defined in this header.
>-#define _GLIBCXX_HAVE_ATOMIC_WAIT 1
>+#define __cpp_lib_atomic_wait 201907L
>
> namespace std _GLIBCXX_VISIBILITY(default)
> {
>diff --git a/libstdc++-v3/include/bits/semaphore_base.h b/libstdc++-v3/include/bits/semaphore_base.h
>index f2984236e03..0ed1f5895af 100644
>--- a/libstdc++-v3/include/bits/semaphore_base.h
>+++ b/libstdc++-v3/include/bits/semaphore_base.h
>@@ -33,7 +33,7 @@
> #pragma GCC system_header
>
> #include <bits/atomic_base.h>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
> #include <bits/atomic_timed_wait.h>
>
> #include <ext/numeric_traits.h>
>@@ -297,5 +297,5 @@ template<ptrdiff_t __least_max_value>
> _GLIBCXX_END_NAMESPACE_VERSION
> } // namespace std
>
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
> #endif // _GLIBCXX_SEMAPHORE_BASE_H
>diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic
>index 664af023d77..4a9b00182a3 100644
>--- a/libstdc++-v3/include/std/atomic
>+++ b/libstdc++-v3/include/std/atomic
>@@ -164,7 +164,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> memory_order __m = memory_order_seq_cst) volatile noexcept
> { return _M_base.compare_exchange_strong(__i1, __i2, __m); }
>
>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>+#if __cpp_lib_atomic_wait
> void
> wait(bool __old, memory_order __m = memory_order_seq_cst) const noexcept
> { _M_base.wait(__old, __m); }
>@@ -178,7 +178,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> void
> notify_all() const noexcept
> { _M_base.notify_all(); }
>-#endif // C++20 && HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
> };
>
> #if __cplusplus <= 201703L
>@@ -380,7 +380,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> { return compare_exchange_strong(__e, __i, __m,
> __cmpexch_failure_order(__m)); }
>
>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>+#if __cpp_lib_atomic_wait
> void
> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
> {
>@@ -404,7 +404,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> void
> notify_all() const noexcept
> { std::__atomic_notify(&_M_i, true); }
>-#endif // C++20 && HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> };
> #undef _GLIBCXX20_INIT
>@@ -644,7 +644,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> __cmpexch_failure_order(__m));
> }
>
>-#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
>+#if __cpp_lib_atomic_wait
> void
> wait(__pointer_type __old, memory_order __m = memory_order_seq_cst) noexcept
> { _M_b.wait(__old, __m); }
>@@ -658,7 +658,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> void
> notify_all() const noexcept
> { _M_b.notify_all(); }
>-#endif // C++20 && HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
> __pointer_type
> fetch_add(ptrdiff_t __d,
> memory_order __m = memory_order_seq_cst) noexcept
>@@ -1412,7 +1412,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> }
>
>
>-#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
>+#if __cpp_lib_atomic_wait
> template<typename _Tp>
> inline void
> atomic_wait(const atomic<_Tp>* __a,
>@@ -1435,7 +1435,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> inline void
> atomic_notify_all(atomic<_Tp>* __a) noexcept
> { __a->notify_all(); }
>-#endif // C++20 && HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
>
> // Function templates for atomic_integral and atomic_pointer operations only.
> // Some operations (and, or, xor) are only available for atomic integrals,
>diff --git a/libstdc++-v3/include/std/latch b/libstdc++-v3/include/std/latch
>index 2684b72288f..3ae77cb1cd2 100644
>--- a/libstdc++-v3/include/std/latch
>+++ b/libstdc++-v3/include/std/latch
>@@ -36,7 +36,7 @@
> #include <bits/atomic_base.h>
> #include <ext/numeric_traits.h>
>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
Just #if not #ifdef
> namespace std _GLIBCXX_VISIBILITY(default)
> {
> _GLIBCXX_BEGIN_NAMESPACE_VERSION
>@@ -89,6 +89,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> };
> _GLIBCXX_END_NAMESPACE_VERSION
> } // namespace
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
> #endif // __cplusplus > 201703L
> #endif // _GLIBCXX_LATCH
>diff --git a/libstdc++-v3/include/std/semaphore b/libstdc++-v3/include/std/semaphore
>index 184c7c2867c..0ecf3bf2fa0 100644
>--- a/libstdc++-v3/include/std/semaphore
>+++ b/libstdc++-v3/include/std/semaphore
>@@ -33,7 +33,7 @@
>
> #if __cplusplus > 201703L
> #include <bits/semaphore_base.h>
>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>+#ifdef __cpp_lib_atomic_wait
#if
> #include <ext/numeric_traits.h>
>
> namespace std _GLIBCXX_VISIBILITY(default)
>@@ -90,6 +90,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> using binary_semaphore = std::counting_semaphore<1>;
> _GLIBCXX_END_NAMESPACE_VERSION
> } // namespace
>-#endif // HAVE_ATOMIC_WAIT
>+#endif // __cpp_lib_atomic_wait
> #endif // C++20
> #endif // _GLIBCXX_SEMAPHORE
>diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version
>index 0f2da8a5ddd..e5502c9e84b 100644
>--- a/libstdc++-v3/include/std/version
>+++ b/libstdc++-v3/include/std/version
>@@ -197,6 +197,9 @@
> #if _GLIBCXX_HOSTED
> #define __cpp_lib_array_constexpr 201811L
> #define __cpp_lib_assume_aligned 201811L
>+#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
>+#define __cpp_lib_atomic_wait 201907L
A single space after the # please.
>+#endif
> #define __cpp_lib_bind_front 201907L
> // FIXME: #define __cpp_lib_execution 201902L
> #define __cpp_lib_integer_comparison_functions 202002L
>@@ -216,7 +219,7 @@
> #ifdef _GLIBCXX_HAS_GTHREADS
> # define __cpp_lib_jthread 201911L
> #endif
>-#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
>+#if defined __cpp_lib_atomic_wait
Remove the "defined".
> # define __cpp_lib_latch 201907L
> #endif
> #define __cpp_lib_list_remove_return_type 201806L
>@@ -228,7 +231,7 @@
> #if __cpp_lib_concepts
> # define __cpp_lib_ranges 201911L
> #endif
>-#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
>+#if defined __cpp_lib_atomic_wait
Remove the "defined".
> # define __cpp_lib_semaphore 201907L
> #endif
> #define __cpp_lib_shift 201806L
>diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
>new file mode 100644
>index 00000000000..5a08d64c1f0
>--- /dev/null
>+++ b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
>@@ -0,0 +1,28 @@
>+// Copyright (C) 2020 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/>.
>+
>+// { dg-options "-std=gnu++2a" }
>+// { dg-do compile { target c++2a } }
This will fail on targets that don't support the feature.
It needs to be:
// { dg-options "-std=gnu++2a" }
// { dg-do compile { target c++2a } }
// { dg-require-effective-target gthreads }
The last line there works since last week when I added "gthreads" as
an effective target keyword, which replaces:
// { dg-require-gthreads "" }
If we wanted to be really correct it would be:
// { dg-require-effective-target gthreads { target { ! futex } } }
Which requires gthreads only for target { ! futex } i.e. if futexes
are supported, then gthreads is not needed (which exactly matches the
code). But it's good enough to just require gthreads, since in
practice the combination of futex && ! gthreads is probably
non-existent. Keeping the directive more readable is more important
than verifying the feature test macro is defined on non-existent
targets.
>+#include <atomic>
>+
>+#ifndef __cpp_lib_atomic_wait
>+# error "Feature-test macro for atomic wait missing in <atomic>"
>+#elif __cpp_lib_atomic_wait != 201907L
>+# error "Feature-test macro for atomic wait has wrong value in <atomic>"
>+#endif
>+
>diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
>new file mode 100644
>index 00000000000..5031a369e79
>--- /dev/null
>+++ b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
>@@ -0,0 +1,29 @@
>+// Copyright (C) 2020 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/>.
>+
>+// { dg-options "-std=gnu++2a" }
>+// { dg-do compile { target c++2a } }
This will fail on non-gthreads targets too. As above.
>+#include <version>
>+
>+#ifndef __cpp_lib_atomic_wait
>+# error "Feature-test macro for atomic wait missing in <version>"
>+#elif __cpp_lib_atomic_wait != 201907L
>+# error "Feature-test macro for atomic wait has wrong value in <version>"
>+#endif
OK with those changes, thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Add feature test macro for atomic<T>::wait
2020-12-01 14:52 ` Jonathan Wakely
@ 2020-12-01 23:45 ` Thomas Rodgers
2020-12-02 0:41 ` Jonathan Wakely
0 siblings, 1 reply; 4+ messages in thread
From: Thomas Rodgers @ 2020-12-01 23:45 UTC (permalink / raw)
To: Jonathan Wakely; +Cc: Thomas Rodgers, gcc-patches, libstdc++
Tested x86_64-pc-linux-gnu, committed to trunk.
Jonathan Wakely writes:
> On 30/11/20 10:17 -0800, Thomas Rodgers wrote:
>>From: Thomas Rodgers <trodgers@redhat.com>
>>
>>Adds __cpp_lib_atomic_wait feature test macro which was overlooked in
>>the initial commit of this feature. Replaces uses of
>>_GLIBCXX_HAVE_ATOMIC_WAIT.
>>
>>libstdc++-v3/ChangeLog:
>>
>> * include/bits/atomic_base.h: Replace usage of
>> _GLIBCXX_HAVE_ATOMIC_WAIT with __cpp_lib_atomic_wait.
>> * include/bits/atomic_timed_wait.h: Likewise.
>> * include/bits/atomic_wait.h: Define __cpp_lib_atomic_wait
>> feature test macro.
>> * include/bits/semaphore_base: Replace usage of
>> _GLIBCXX_HAVE_ATOMIC_WAIT with __cpp_lib_atomic_wait.
>> * include/std/atomic: Likewise.
>> * include/std/latch: Likewise.
>> * include/std/semaphore: Likewise.
>> * include/std/version: Define __cpp_lib_atomic wait
>> feature test macro and replace usage of
>> _GLIBCXX_HAVE_ATOMIC_WAIT.
>> * testsuite/29_atomics/atomic/wait_notify/1.cc: New test.
>> * testsuite/29_atomics/atomic/wait_notify/2.cc: Likewise.
>>
>>---
>> libstdc++-v3/include/bits/atomic_base.h | 36 +++++++++----------
>> libstdc++-v3/include/bits/atomic_timed_wait.h | 5 +--
>> libstdc++-v3/include/bits/atomic_wait.h | 3 +-
>> libstdc++-v3/include/bits/semaphore_base.h | 4 +--
>> libstdc++-v3/include/std/atomic | 16 ++++-----
>> libstdc++-v3/include/std/latch | 4 +--
>> libstdc++-v3/include/std/semaphore | 4 +--
>> libstdc++-v3/include/std/version | 7 ++--
>> .../29_atomics/atomic/wait_notify/1.cc | 28 +++++++++++++++
>> .../29_atomics/atomic/wait_notify/2.cc | 29 +++++++++++++++
>> 10 files changed, 98 insertions(+), 38 deletions(-)
>> create mode 100644 libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
>> create mode 100644 libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
>>
>>diff --git a/libstdc++-v3/include/bits/atomic_base.h b/libstdc++-v3/include/bits/atomic_base.h
>>index d0d962d3047..ad4e24b4d20 100644
>>--- a/libstdc++-v3/include/bits/atomic_base.h
>>+++ b/libstdc++-v3/include/bits/atomic_base.h
>>@@ -230,7 +230,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> return __v == __GCC_ATOMIC_TEST_AND_SET_TRUEVAL;
>> }
>>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>
> I've not always been consistent about using #if or #ifdef for
> __cpp_lib macros, but let's not make that worse in a single patch. I
> think we should just use #if for __cpp_lib macros. That affects
> several places in the patch.
>
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(bool __old,
>> memory_order __m = memory_order_seq_cst) const noexcept
>>@@ -253,7 +253,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { std::__atomic_notify(&_M_i, true); }
>>
>> // TODO add const volatile overload
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>> #endif // C++20
>>
>> _GLIBCXX_ALWAYS_INLINE void
>>@@ -604,7 +604,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> __cmpexch_failure_order(__m));
>> }
>>
>>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#if __cpp_lib_atomic_wait
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(__int_type __old,
>> memory_order __m = memory_order_seq_cst) const noexcept
>>@@ -627,7 +627,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { std::__atomic_notify(&_M_i, true); }
>>
>> // TODO add const volatile overload
>>-#endif // C++20 && HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> _GLIBCXX_ALWAYS_INLINE __int_type
>> fetch_add(__int_type __i,
>>@@ -898,7 +898,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> int(__m1), int(__m2));
>> }
>>
>>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#if __cpp_lib_atomic_wait
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(__pointer_type __old,
>> memory_order __m = memory_order_seq_cst) noexcept
>>@@ -921,7 +921,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { std::__atomic_notify(&_M_p, true); }
>>
>> // TODO add const volatile overload
>>-#endif // C++20 && HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> _GLIBCXX_ALWAYS_INLINE __pointer_type
>> fetch_add(ptrdiff_t __d,
>>@@ -1011,7 +1011,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> int(__success), int(__failure));
>> }
>>
>>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#if __cpp_lib_atomic_wait
>> template<typename _Tp>
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(const _Tp* __ptr, _Val<_Tp> __old,
>>@@ -1036,7 +1036,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { std::__atomic_notify(__ptr, true); }
>>
>> // TODO add const volatile overload
>>-#endif // C++20 && HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> template<typename _Tp>
>> _GLIBCXX_ALWAYS_INLINE _Tp
>>@@ -1291,7 +1291,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> __cmpexch_failure_order(__order));
>> }
>>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
>> { __atomic_impl::wait(&_M_fp, __old, __m); }
>>@@ -1309,7 +1309,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { __atomic_impl::notify_all(&_M_fp); }
>>
>> // TODO add const volatile overload
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> value_type
>> fetch_add(value_type __i,
>>@@ -1448,7 +1448,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> __cmpexch_failure_order(__order));
>> }
>>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
>> { __atomic_impl::wait(_M_ptr, __old, __m); }
>>@@ -1466,7 +1466,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { __atomic_impl::notify_all(_M_ptr); }
>>
>> // TODO add const volatile overload
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> private:
>> _Tp* _M_ptr;
>>@@ -1563,7 +1563,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> __cmpexch_failure_order(__order));
>> }
>>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
>> { __atomic_impl::wait(_M_ptr, __old, __m); }
>>@@ -1581,7 +1581,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { __atomic_impl::notify_all(_M_ptr); }
>>
>> // TODO add const volatile overload
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> value_type
>> fetch_add(value_type __i,
>>@@ -1738,7 +1738,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> __cmpexch_failure_order(__order));
>> }
>>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(_Fp __old, memory_order __m = memory_order_seq_cst) const noexcept
>> { __atomic_impl::wait(_M_ptr, __old, __m); }
>>@@ -1756,7 +1756,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { __atomic_impl::notify_all(_M_ptr); }
>>
>> // TODO add const volatile overload
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> value_type
>> fetch_add(value_type __i,
>>@@ -1867,7 +1867,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> __cmpexch_failure_order(__order));
>> }
>>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>> _GLIBCXX_ALWAYS_INLINE void
>> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
>> { __atomic_impl::wait(_M_ptr, __old, __m); }
>>@@ -1885,7 +1885,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { __atomic_impl::notify_all(_M_ptr); }
>>
>> // TODO add const volatile overload
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> _GLIBCXX_ALWAYS_INLINE value_type
>> fetch_add(difference_type __d,
>>diff --git a/libstdc++-v3/include/bits/atomic_timed_wait.h b/libstdc++-v3/include/bits/atomic_timed_wait.h
>>index f3a07a36722..6dd1a145e69 100644
>>--- a/libstdc++-v3/include/bits/atomic_timed_wait.h
>>+++ b/libstdc++-v3/include/bits/atomic_timed_wait.h
>>@@ -33,7 +33,8 @@
>> #pragma GCC system_header
>>
>> #include <bits/atomic_wait.h>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+
>>+#ifdef __cpp_lib_atomic_wait
>> #include <bits/functional_hash.h>
>>
>> #include <chrono>
>>@@ -292,5 +293,5 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> }
>> _GLIBCXX_END_NAMESPACE_VERSION
>> } // namespace std
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>> #endif // _GLIBCXX_ATOMIC_TIMED_WAIT_H
>>diff --git a/libstdc++-v3/include/bits/atomic_wait.h b/libstdc++-v3/include/bits/atomic_wait.h
>>index a59ed8cb418..5efd96d22a1 100644
>>--- a/libstdc++-v3/include/bits/atomic_wait.h
>>+++ b/libstdc++-v3/include/bits/atomic_wait.h
>>@@ -50,8 +50,7 @@
>> # include <bits/std_mutex.h> // std::mutex, std::__condvar
>> #endif
>>
>>-// Other headers use this to check for the facilities defined in this header.
>>-#define _GLIBCXX_HAVE_ATOMIC_WAIT 1
>>+#define __cpp_lib_atomic_wait 201907L
>>
>> namespace std _GLIBCXX_VISIBILITY(default)
>> {
>>diff --git a/libstdc++-v3/include/bits/semaphore_base.h b/libstdc++-v3/include/bits/semaphore_base.h
>>index f2984236e03..0ed1f5895af 100644
>>--- a/libstdc++-v3/include/bits/semaphore_base.h
>>+++ b/libstdc++-v3/include/bits/semaphore_base.h
>>@@ -33,7 +33,7 @@
>> #pragma GCC system_header
>>
>> #include <bits/atomic_base.h>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>> #include <bits/atomic_timed_wait.h>
>>
>> #include <ext/numeric_traits.h>
>>@@ -297,5 +297,5 @@ template<ptrdiff_t __least_max_value>
>> _GLIBCXX_END_NAMESPACE_VERSION
>> } // namespace std
>>
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>> #endif // _GLIBCXX_SEMAPHORE_BASE_H
>>diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic
>>index 664af023d77..4a9b00182a3 100644
>>--- a/libstdc++-v3/include/std/atomic
>>+++ b/libstdc++-v3/include/std/atomic
>>@@ -164,7 +164,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> memory_order __m = memory_order_seq_cst) volatile noexcept
>> { return _M_base.compare_exchange_strong(__i1, __i2, __m); }
>>
>>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#if __cpp_lib_atomic_wait
>> void
>> wait(bool __old, memory_order __m = memory_order_seq_cst) const noexcept
>> { _M_base.wait(__old, __m); }
>>@@ -178,7 +178,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> void
>> notify_all() const noexcept
>> { _M_base.notify_all(); }
>>-#endif // C++20 && HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>> };
>>
>> #if __cplusplus <= 201703L
>>@@ -380,7 +380,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> { return compare_exchange_strong(__e, __i, __m,
>> __cmpexch_failure_order(__m)); }
>>
>>-#if __cplusplus > 201703L && defined _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#if __cpp_lib_atomic_wait
>> void
>> wait(_Tp __old, memory_order __m = memory_order_seq_cst) const noexcept
>> {
>>@@ -404,7 +404,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> void
>> notify_all() const noexcept
>> { std::__atomic_notify(&_M_i, true); }
>>-#endif // C++20 && HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> };
>> #undef _GLIBCXX20_INIT
>>@@ -644,7 +644,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> __cmpexch_failure_order(__m));
>> }
>>
>>-#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#if __cpp_lib_atomic_wait
>> void
>> wait(__pointer_type __old, memory_order __m = memory_order_seq_cst) noexcept
>> { _M_b.wait(__old, __m); }
>>@@ -658,7 +658,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> void
>> notify_all() const noexcept
>> { _M_b.notify_all(); }
>>-#endif // C++20 && HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>> __pointer_type
>> fetch_add(ptrdiff_t __d,
>> memory_order __m = memory_order_seq_cst) noexcept
>>@@ -1412,7 +1412,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> }
>>
>>
>>-#if __cplusplus > 201703L && _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#if __cpp_lib_atomic_wait
>> template<typename _Tp>
>> inline void
>> atomic_wait(const atomic<_Tp>* __a,
>>@@ -1435,7 +1435,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> inline void
>> atomic_notify_all(atomic<_Tp>* __a) noexcept
>> { __a->notify_all(); }
>>-#endif // C++20 && HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>>
>> // Function templates for atomic_integral and atomic_pointer operations only.
>> // Some operations (and, or, xor) are only available for atomic integrals,
>>diff --git a/libstdc++-v3/include/std/latch b/libstdc++-v3/include/std/latch
>>index 2684b72288f..3ae77cb1cd2 100644
>>--- a/libstdc++-v3/include/std/latch
>>+++ b/libstdc++-v3/include/std/latch
>>@@ -36,7 +36,7 @@
>> #include <bits/atomic_base.h>
>> #include <ext/numeric_traits.h>
>>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>
> Just #if not #ifdef
>
>> namespace std _GLIBCXX_VISIBILITY(default)
>> {
>> _GLIBCXX_BEGIN_NAMESPACE_VERSION
>>@@ -89,6 +89,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> };
>> _GLIBCXX_END_NAMESPACE_VERSION
>> } // namespace
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>> #endif // __cplusplus > 201703L
>> #endif // _GLIBCXX_LATCH
>>diff --git a/libstdc++-v3/include/std/semaphore b/libstdc++-v3/include/std/semaphore
>>index 184c7c2867c..0ecf3bf2fa0 100644
>>--- a/libstdc++-v3/include/std/semaphore
>>+++ b/libstdc++-v3/include/std/semaphore
>>@@ -33,7 +33,7 @@
>>
>> #if __cplusplus > 201703L
>> #include <bits/semaphore_base.h>
>>-#ifdef _GLIBCXX_HAVE_ATOMIC_WAIT
>>+#ifdef __cpp_lib_atomic_wait
>
> #if
>
>> #include <ext/numeric_traits.h>
>>
>> namespace std _GLIBCXX_VISIBILITY(default)
>>@@ -90,6 +90,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>> using binary_semaphore = std::counting_semaphore<1>;
>> _GLIBCXX_END_NAMESPACE_VERSION
>> } // namespace
>>-#endif // HAVE_ATOMIC_WAIT
>>+#endif // __cpp_lib_atomic_wait
>> #endif // C++20
>> #endif // _GLIBCXX_SEMAPHORE
>>diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version
>>index 0f2da8a5ddd..e5502c9e84b 100644
>>--- a/libstdc++-v3/include/std/version
>>+++ b/libstdc++-v3/include/std/version
>>@@ -197,6 +197,9 @@
>> #if _GLIBCXX_HOSTED
>> #define __cpp_lib_array_constexpr 201811L
>> #define __cpp_lib_assume_aligned 201811L
>>+#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
>>+#define __cpp_lib_atomic_wait 201907L
>
> A single space after the # please.
>
>>+#endif
>> #define __cpp_lib_bind_front 201907L
>> // FIXME: #define __cpp_lib_execution 201902L
>> #define __cpp_lib_integer_comparison_functions 202002L
>>@@ -216,7 +219,7 @@
>> #ifdef _GLIBCXX_HAS_GTHREADS
>> # define __cpp_lib_jthread 201911L
>> #endif
>>-#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
>>+#if defined __cpp_lib_atomic_wait
>
> Remove the "defined".
>
>> # define __cpp_lib_latch 201907L
>> #endif
>> #define __cpp_lib_list_remove_return_type 201806L
>>@@ -228,7 +231,7 @@
>> #if __cpp_lib_concepts
>> # define __cpp_lib_ranges 201911L
>> #endif
>>-#if defined _GLIBCXX_HAS_GTHREADS || defined _GLIBCXX_HAVE_LINUX_FUTEX
>>+#if defined __cpp_lib_atomic_wait
>
> Remove the "defined".
>
>> # define __cpp_lib_semaphore 201907L
>> #endif
>> #define __cpp_lib_shift 201806L
>>diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
>>new file mode 100644
>>index 00000000000..5a08d64c1f0
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/1.cc
>>@@ -0,0 +1,28 @@
>>+// Copyright (C) 2020 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/>.
>>+
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do compile { target c++2a } }
>
> This will fail on targets that don't support the feature.
>
> It needs to be:
>
> // { dg-options "-std=gnu++2a" }
> // { dg-do compile { target c++2a } }
> // { dg-require-effective-target gthreads }
>
> The last line there works since last week when I added "gthreads" as
> an effective target keyword, which replaces:
>
> // { dg-require-gthreads "" }
>
> If we wanted to be really correct it would be:
>
> // { dg-require-effective-target gthreads { target { ! futex } } }
>
> Which requires gthreads only for target { ! futex } i.e. if futexes
> are supported, then gthreads is not needed (which exactly matches the
> code). But it's good enough to just require gthreads, since in
> practice the combination of futex && ! gthreads is probably
> non-existent. Keeping the directive more readable is more important
> than verifying the feature test macro is defined on non-existent
> targets.
>
>>+#include <atomic>
>>+
>>+#ifndef __cpp_lib_atomic_wait
>>+# error "Feature-test macro for atomic wait missing in <atomic>"
>>+#elif __cpp_lib_atomic_wait != 201907L
>>+# error "Feature-test macro for atomic wait has wrong value in <atomic>"
>>+#endif
>>+
>>diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
>>new file mode 100644
>>index 00000000000..5031a369e79
>>--- /dev/null
>>+++ b/libstdc++-v3/testsuite/29_atomics/atomic/wait_notify/2.cc
>>@@ -0,0 +1,29 @@
>>+// Copyright (C) 2020 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/>.
>>+
>>+// { dg-options "-std=gnu++2a" }
>>+// { dg-do compile { target c++2a } }
>
> This will fail on non-gthreads targets too. As above.
>
>>+#include <version>
>>+
>>+#ifndef __cpp_lib_atomic_wait
>>+# error "Feature-test macro for atomic wait missing in <version>"
>>+#elif __cpp_lib_atomic_wait != 201907L
>>+# error "Feature-test macro for atomic wait has wrong value in <version>"
>>+#endif
>
>
> OK with those changes, thanks.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Add feature test macro for atomic<T>::wait
2020-12-01 23:45 ` Thomas Rodgers
@ 2020-12-02 0:41 ` Jonathan Wakely
0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Wakely @ 2020-12-02 0:41 UTC (permalink / raw)
To: Thomas Rodgers; +Cc: gcc-patches, libstdc++
[-- Attachment #1: Type: text/plain, Size: 206 bytes --]
On 01/12/20 15:45 -0800, Thomas Rodgers via Libstdc++ wrote:
>Tested x86_64-pc-linux-gnu, committed to trunk.
This does a couple more #ifdef -> #if changes.
Tested powerpc64le-linux, committed to trunk.
[-- Attachment #2: patch.txt --]
[-- Type: text/x-patch, Size: 2016 bytes --]
commit 670f5095e4aacc30099f6b73c1e67c06df76f36b
Author: Jonathan Wakely <jwakely@redhat.com>
Date: Wed Dec 2 00:39:22 2020
libstdc++: Make preprocessor checks for __cpp_lib_atomic_wait consistent
This changes some #ifdef checks to use #if instead.
libstdc++-v3/ChangeLog:
* include/bits/atomic_timed_wait.h: Use #if instead of #ifdef.
* include/bits/semaphore_base.h: Likewise.
* include/std/version: Remove trailing whitespace.
diff --git a/libstdc++-v3/include/bits/atomic_timed_wait.h b/libstdc++-v3/include/bits/atomic_timed_wait.h
index 6dd1a145e69..83438ae31ed 100644
--- a/libstdc++-v3/include/bits/atomic_timed_wait.h
+++ b/libstdc++-v3/include/bits/atomic_timed_wait.h
@@ -34,7 +34,7 @@
#include <bits/atomic_wait.h>
-#ifdef __cpp_lib_atomic_wait
+#if __cpp_lib_atomic_wait
#include <bits/functional_hash.h>
#include <chrono>
diff --git a/libstdc++-v3/include/bits/semaphore_base.h b/libstdc++-v3/include/bits/semaphore_base.h
index 0ed1f5895af..e4e57de4acf 100644
--- a/libstdc++-v3/include/bits/semaphore_base.h
+++ b/libstdc++-v3/include/bits/semaphore_base.h
@@ -33,7 +33,7 @@
#pragma GCC system_header
#include <bits/atomic_base.h>
-#ifdef __cpp_lib_atomic_wait
+#if __cpp_lib_atomic_wait
#include <bits/atomic_timed_wait.h>
#include <ext/numeric_traits.h>
diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version
index 4bb45b7805c..25f628f399d 100644
--- a/libstdc++-v3/include/std/version
+++ b/libstdc++-v3/include/std/version
@@ -219,7 +219,7 @@
#ifdef _GLIBCXX_HAS_GTHREADS
# define __cpp_lib_jthread 201911L
#endif
-#if __cpp_lib_atomic_wait
+#if __cpp_lib_atomic_wait
# define __cpp_lib_latch 201907L
#endif
#define __cpp_lib_list_remove_return_type 201806L
@@ -231,7 +231,7 @@
#if __cpp_lib_concepts
# define __cpp_lib_ranges 201911L
#endif
-#if __cpp_lib_atomic_wait
+#if __cpp_lib_atomic_wait
# define __cpp_lib_semaphore 201907L
#endif
#define __cpp_lib_shift 201806L
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-12-02 0:41 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-30 18:17 [PATCH] Add feature test macro for atomic<T>::wait Thomas Rodgers
2020-12-01 14:52 ` Jonathan Wakely
2020-12-01 23:45 ` Thomas Rodgers
2020-12-02 0:41 ` Jonathan Wakely
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).