Add feature test macro for atomic<T>::wait

Message ID 20201130181740.1112277-1-rodgert@appliantology.com
State New
Headers show
Series
  • Add feature test macro for atomic<T>::wait
Related show

Commit Message

Thomas Rodgers Nov. 30, 2020, 6:17 p.m.
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

-- 
2.26.2

Comments

Harald Anlauf via Gcc-patches Dec. 1, 2020, 2:52 p.m. | #1
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.
Harald Anlauf via Gcc-patches Dec. 1, 2020, 11:45 p.m. | #2
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.
Harald Anlauf via Gcc-patches Dec. 2, 2020, 12:41 a.m. | #3
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.
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

Patch

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
+
+