From 476a194935fa55f9e18f9193d25d86170f2219ab Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Thu, 22 Jan 2026 15:31:08 -0800 Subject: [PATCH] [libc] Handle charNN_t in cpp::is_integral (#177463) In C++20, char8_t is a distinct type from unsigned char, but is still an integral type. char16_t and char32_t are integral types in both C++17 and C++20. This also reverts the change in PR #177421, which is not needed when cpp::is_integral_v works correctly in all modes. --- libc/src/__support/CPP/type_traits/is_integral.h | 15 ++++++++++----- libc/src/__support/wchar/character_converter.h | 3 +-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/libc/src/__support/CPP/type_traits/is_integral.h b/libc/src/__support/CPP/type_traits/is_integral.h index 96ba09a07ddc..09047cb00bf7 100644 --- a/libc/src/__support/CPP/type_traits/is_integral.h +++ b/libc/src/__support/CPP/type_traits/is_integral.h @@ -26,13 +26,18 @@ private: } public: - LIBC_INLINE_VAR static constexpr bool value = __is_unqualified_any_of< - T, + LIBC_INLINE_VAR static constexpr bool value = + __is_unqualified_any_of(); +#ifdef __cpp_char8_t + char8_t, +#endif + char16_t, char32_t, char, signed char, + unsigned char, short, unsigned short, int, + unsigned int, long, unsigned long, long long, + unsigned long long, bool>(); }; template LIBC_INLINE_VAR constexpr bool is_integral_v = is_integral::value; diff --git a/libc/src/__support/wchar/character_converter.h b/libc/src/__support/wchar/character_converter.h index d0a942ecb3bb..e7300166556a 100644 --- a/libc/src/__support/wchar/character_converter.h +++ b/libc/src/__support/wchar/character_converter.h @@ -77,8 +77,7 @@ LIBC_INLINE bool CharacterConverter::isValidState() { } LIBC_INLINE int CharacterConverter::push(char8_t utf8_byte) { - uint8_t num_ones = - static_cast(cpp::countl_one(static_cast(utf8_byte))); + uint8_t num_ones = static_cast(cpp::countl_one(utf8_byte)); // Checking the first byte if first push if (isEmpty()) { // UTF-8 char has 1 byte total