On Mon, 12 May 2025 at 11:19, Tomasz Kaminski <tkami...@redhat.com> wrote:
>
>
>
> 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.

Done and pushed.


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

Reply via email to