https://gcc.gnu.org/g:7407891a3d7c177212c6027c1dee08bed096666b

commit r16-1270-g7407891a3d7c177212c6027c1dee08bed096666b
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Fri Jun 6 14:16:15 2025 +0100

    libstdc++: Use std::conditional_t instead of lambda to select semaphore 
implementation
    
    The lambda expression causes testsuite failures such as:
    FAIL g++.dg/modules/xtreme-header-2_b.C -std=c++26 (test for excess errors)
    
    libstdc++-v3/ChangeLog:
    
            * include/bits/semaphore_base.h (_Select_semaphore_impl): Rename
            to _Semaphore_impl and use std::conditional_t instead of an
            immediately invoked lambda expression.
            * include/std/semaphore (counting_semaphore): Adjust to use new
            name.

Diff:
---
 libstdc++-v3/include/bits/semaphore_base.h | 22 ++++++----------------
 libstdc++-v3/include/std/semaphore         |  4 ++--
 2 files changed, 8 insertions(+), 18 deletions(-)

diff --git a/libstdc++-v3/include/bits/semaphore_base.h 
b/libstdc++-v3/include/bits/semaphore_base.h
index ebbc9a80b91a..82871ce3518b 100644
--- a/libstdc++-v3/include/bits/semaphore_base.h
+++ b/libstdc++-v3/include/bits/semaphore_base.h
@@ -289,22 +289,12 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     alignas(__detail::__platform_wait_alignment) __count_type _M_counter;
   };
 
-  template<ptrdiff_t _Max>
-    using _Select_semaphore_impl = typename decltype([]
-    {
-      using namespace __detail;
-      if constexpr (__platform_wait_uses_type<__platform_wait_t>)
-       {
-         if constexpr (_Max <= 1)
-           return type_identity<__platform_semaphore_impl<true>>{};
-         else if constexpr (_Max <= __platform_semaphore_impl<false>::_S_max)
-           return type_identity<__platform_semaphore_impl<false>>{};
-         else
-           return type_identity<__semaphore_impl>{};
-       }
-      else
-       return type_identity<__semaphore_impl>{};
-    }())::type;
+  template<ptrdiff_t _Max, typename _Tp = __detail::__platform_wait_t>
+    using _Semaphore_impl
+      = __conditional_t<__platform_wait_uses_type<_Tp>
+                         && _Max <= __gnu_cxx::__int_traits<_Tp>::__max,
+                       __platform_semaphore_impl<(_Max <= 1)>,
+                       __semaphore_impl>;
 
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
diff --git a/libstdc++-v3/include/std/semaphore 
b/libstdc++-v3/include/std/semaphore
index 8f49188563e8..18d04075776c 100644
--- a/libstdc++-v3/include/std/semaphore
+++ b/libstdc++-v3/include/std/semaphore
@@ -45,12 +45,12 @@ namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-  template<ptrdiff_t __least_max_value = _Select_semaphore_impl<2>::_S_max>
+  template<ptrdiff_t __least_max_value = _Semaphore_impl<2>::_S_max>
     class counting_semaphore
     {
       static_assert(__least_max_value >= 0);
 
-      _Select_semaphore_impl<__least_max_value> _M_sem;
+      _Semaphore_impl<__least_max_value> _M_sem;
 
     public:
       constexpr explicit

Reply via email to