On Tue, 27 Feb 2024 at 11:49, Jonathan Wakely <jwak...@redhat.com> wrote: > > Tested x86_64-linux. I think we should make this change, because > otherwise we define the typedefs for platforms with no lock-free > atomics, like hppa-hpux. Instead of lying, those typedefs should be > absent on that target. > > -- >8 -- > > libstdc++-v3/ChangeLog: > > PR libstdc++/114103 > * include/bits/version.def (atomic_lock_free_type_aliases): Add > extra_cond to check for at least one always-lock-free type. > * include/bits/version.h: Regenerate. > * include/std/atomic (atomic_signed_lock_free) > (atomic_unsigned_lock_free): Only use always-lock-free types. > --- > libstdc++-v3/include/bits/version.def | 1 + > libstdc++-v3/include/bits/version.h | 2 +- > libstdc++-v3/include/std/atomic | 6 +++--- > 3 files changed, 5 insertions(+), 4 deletions(-) > > diff --git a/libstdc++-v3/include/bits/version.def > b/libstdc++-v3/include/bits/version.def > index 502961eb269..d298420121b 100644 > --- a/libstdc++-v3/include/bits/version.def > +++ b/libstdc++-v3/include/bits/version.def > @@ -739,6 +739,7 @@ ftms = { > values = { > v = 201907; > cxxmin = 20; > + extra_cond = "(__GCC_ATOMIC_INT_LOCK_FREE | __GCC_ATOMIC_LONG_LOCK_FREE > | __GCC_ATOMIC_CHAR_LOCK_FREE) & 2";
Maybe this should be > 1 instead of & 2 in case there are targets that define it to 4 or something. I think those are only supposed to be defined to 0, 1, or 2 though. > }; > }; > > diff --git a/libstdc++-v3/include/bits/version.h > b/libstdc++-v3/include/bits/version.h > index 7a6fbd35e2e..9107b45a484 100644 > --- a/libstdc++-v3/include/bits/version.h > +++ b/libstdc++-v3/include/bits/version.h > @@ -819,7 +819,7 @@ > #undef __glibcxx_want_atomic_float > > #if !defined(__cpp_lib_atomic_lock_free_type_aliases) > -# if (__cplusplus >= 202002L) > +# if (__cplusplus >= 202002L) && ((__GCC_ATOMIC_INT_LOCK_FREE | > __GCC_ATOMIC_LONG_LOCK_FREE | __GCC_ATOMIC_CHAR_LOCK_FREE) & 2) > # define __glibcxx_atomic_lock_free_type_aliases 201907L > # if defined(__glibcxx_want_all) || > defined(__glibcxx_want_atomic_lock_free_type_aliases) > # define __cpp_lib_atomic_lock_free_type_aliases 201907L > diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic > index 559f8370459..1462cf5ec23 100644 > --- a/libstdc++-v3/include/std/atomic > +++ b/libstdc++-v3/include/std/atomic > @@ -1774,13 +1774,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > = atomic<make_signed_t<__detail::__platform_wait_t>>; > using atomic_unsigned_lock_free > = atomic<make_unsigned_t<__detail::__platform_wait_t>>; > -# elif ATOMIC_INT_LOCK_FREE || !(ATOMIC_LONG_LOCK_FREE || > ATOMIC_CHAR_LOCK_FREE) > +# elif ATOMIC_INT_LOCK_FREE == 2 Similarly, this could be > 1 but again, I think == 2 is OK. > using atomic_signed_lock_free = atomic<signed int>; > using atomic_unsigned_lock_free = atomic<unsigned int>; > -# elif ATOMIC_LONG_LOCK_FREE > +# elif ATOMIC_LONG_LOCK_FREE == 2 > using atomic_signed_lock_free = atomic<signed long>; > using atomic_unsigned_lock_free = atomic<unsigned long>; > -# elif ATOMIC_CHAR_LOCK_FREE > +# elif ATOMIC_CHAR_LOCK_FREE == 2 > using atomic_signed_lock_free = atomic<signed char>; > using atomic_unsigned_lock_free = atomic<unsigned char>; > # else > -- > 2.43.0 >