On Mon, May 12, 2025 at 12:04 PM Jonathan Wakely <jwak...@redhat.com> wrote:
> This was a regression introduced with using version.def to define > feature test macros. Could you add link to commit here, I think this is r14-3248-g083b7f2833d71d. > std::scoped_lock can be defined unconditionally > (including for freestanding). > > libstdc++-v3/ChangeLog: > > PR libstdc++/120198 > * include/bits/version.def (scoped_lock): Do not depend on > gthreads or hosted. > * include/bits/version.h: Regenerate. > * include/std/mutex (scoped_lock): Update comment. > * testsuite/30_threads/scoped_lock/requirements/typedefs.cc: > Remove dg-require-gthreads and use custom lockable type instead > of std::mutex. Check that typedef is only present for a single > template argument. > --- > > Tested x86_64-linux. > LGTM. > > libstdc++-v3/include/bits/version.def | 2 -- > libstdc++-v3/include/bits/version.h | 2 +- > libstdc++-v3/include/std/mutex | 2 +- > .../scoped_lock/requirements/typedefs.cc | 28 ++++++++++++++++--- > 4 files changed, 26 insertions(+), 8 deletions(-) > > diff --git a/libstdc++-v3/include/bits/version.def > b/libstdc++-v3/include/bits/version.def > index f4d3de88bb2b..2d34a8dff7fc 100644 > --- a/libstdc++-v3/include/bits/version.def > +++ b/libstdc++-v3/include/bits/version.def > @@ -679,8 +679,6 @@ ftms = { > values = { > v = 201703; > cxxmin = 17; > - hosted = yes; > - gthread = yes; > }; > }; > > diff --git a/libstdc++-v3/include/bits/version.h > b/libstdc++-v3/include/bits/version.h > index d5d75cef2de1..24831f70b417 100644 > --- a/libstdc++-v3/include/bits/version.h > +++ b/libstdc++-v3/include/bits/version.h > @@ -751,7 +751,7 @@ > #undef __glibcxx_want_parallel_algorithm > > #if !defined(__cpp_lib_scoped_lock) > -# if (__cplusplus >= 201703L) && defined(_GLIBCXX_HAS_GTHREADS) && > _GLIBCXX_HOSTED > +# if (__cplusplus >= 201703L) > # define __glibcxx_scoped_lock 201703L > # if defined(__glibcxx_want_all) || defined(__glibcxx_want_scoped_lock) > # define __cpp_lib_scoped_lock 201703L > diff --git a/libstdc++-v3/include/std/mutex > b/libstdc++-v3/include/std/mutex > index b3f89c0b9435..e575a81c138e 100644 > --- a/libstdc++-v3/include/std/mutex > +++ b/libstdc++-v3/include/std/mutex > @@ -733,7 +733,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION > } > } > > -#ifdef __cpp_lib_scoped_lock // C++ >= 17 && hosted && gthread > +#ifdef __cpp_lib_scoped_lock // C++ >= 17 > /** @brief A scoped lock type for multiple lockable objects. > * > * A scoped_lock controls mutex ownership within a scope, releasing > diff --git > a/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc > b/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc > index 4cd07da44657..ba52b36a3111 100644 > --- > a/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc > +++ > b/libstdc++-v3/testsuite/30_threads/scoped_lock/requirements/typedefs.cc > @@ -1,5 +1,4 @@ > // { dg-do compile { target c++17 } } > -// { dg-require-gthreads "" } > // { dg-add-options no_pch } > > // Copyright (C) 2017-2025 Free Software Foundation, Inc. > @@ -29,9 +28,30 @@ > # error "Feature-test macro for scoped_lock has wrong value" > #endif > > +struct BasicLockable > +{ > + BasicLockable() = default; > + ~BasicLockable() = default; > + void lock() { } > + void unlock() { } > +}; > + > void test01() > { > - // Check for required typedefs > - typedef std::scoped_lock<std::mutex> test_type; > - typedef test_type::mutex_type mutex_type; > + // Check for required typedef. > + using test_type = std::scoped_lock<BasicLockable>; > + static_assert(std::is_same_v<test_type::mutex_type, BasicLockable>); > +} > + > +template<typename T, typename = void> > +constexpr bool has_mutex_type = false; > + > +template<typename T> > +constexpr bool has_mutex_type<T, std::void_t<typename T::mutex_type>> = > true; > + > +void test02() > +{ > + // Check that typedef is absent as required. > + using test_type = std::scoped_lock<BasicLockable, BasicLockable>; > + static_assert(!has_mutex_type<test_type>); > } > -- > 2.49.0 > >