[gcc r16-1270] libstdc++: Use std::conditional_t instead of lambda to select semaphore implementation
Jonathan Wakely
redi@gcc.gnu.org
Fri Jun 6 19:15:23 GMT 2025
https://gcc.gnu.org/g:7407891a3d7c177212c6027c1dee08bed096666b
commit r16-1270-g7407891a3d7c177212c6027c1dee08bed096666b
Author: Jonathan Wakely <jwakely@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
More information about the Libstdc++-cvs
mailing list