https://gcc.gnu.org/g:59f6328034385e2861c3f3115380f2f098e99f37
commit r16-2254-g59f6328034385e2861c3f3115380f2f098e99f37 Author: Jonathan Wakely <jwak...@redhat.com> Date: Sun Jul 13 15:05:52 2025 +0100 libstdc++: Ensure std::make_unsigned<Enum> works for 128-bit enum Another follow-up to r16-2190-g4faa42ac0dee2c, ensuring that make_signed and make_unsigned work on enumeration types with 128-bit integers as their underlying type. libstdc++-v3/ChangeLog: * include/std/type_traits (__make_unsigned_selector): Add unsigned __int128 to type list. * testsuite/20_util/make_unsigned/int128.cc: New test. Reviewed-by: Tomasz KamiĆski <tkami...@redhat.com> Diff: --- libstdc++-v3/include/std/type_traits | 7 ++++++- libstdc++-v3/testsuite/20_util/make_unsigned/int128.cc | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libstdc++-v3/include/std/type_traits b/libstdc++-v3/include/std/type_traits index 78a5ee8c0eb4..ff23544fbf03 100644 --- a/libstdc++-v3/include/std/type_traits +++ b/libstdc++-v3/include/std/type_traits @@ -1992,8 +1992,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION : __make_unsigned_selector_base { // With -fshort-enums, an enum may be as small as a char. + __extension__ using _UInts = _List<unsigned char, unsigned short, unsigned int, - unsigned long, unsigned long long>; + unsigned long, unsigned long long +#ifdef __SIZEOF_INT128__ + , unsigned __int128 +#endif + >; using __unsigned_type = typename __select<sizeof(_Tp), _UInts>::__type; diff --git a/libstdc++-v3/testsuite/20_util/make_unsigned/int128.cc b/libstdc++-v3/testsuite/20_util/make_unsigned/int128.cc new file mode 100644 index 000000000000..46c07b7669e5 --- /dev/null +++ b/libstdc++-v3/testsuite/20_util/make_unsigned/int128.cc @@ -0,0 +1,14 @@ +// { dg-do compile { target c++11 } } +// { dg-add-options strict_std } + +#include <type_traits> + +#ifdef __SIZEOF_INT128__ +enum E : __int128 { }; +using U = std::make_unsigned<E>::type; +static_assert( std::is_integral<U>::value, "type is an integer" ); +static_assert( sizeof(U) == sizeof(E), "width of type is 128 bits" ); +using I = std::make_signed<E>::type; +static_assert( std::is_integral<I>::value, "type is an integer" ); +static_assert( sizeof(I) == sizeof(E), "width of type is 128 bits" ); +#endif