https://gcc.gnu.org/g:975025de350bb8cc264fef0a5f88f71abe5b3791
commit r16-7105-g975025de350bb8cc264fef0a5f88f71abe5b3791 Author: Jonathan Wakely <[email protected]> Date: Fri Jan 23 14:04:26 2026 +0000 libstdc++: Avoid -Wtype-limits warnings in locale/gnu/ctype_members.cc On targets where wchar_t is unsigned we get warnings during the libstdc++ build: ctype_members.cc: In member function ‘virtual char std::ctype<wchar_t>::do_narrow(wchar_t, char) const’: ctype_members.cc:224:14: warning: comparison of unsigned expression in ‘>= 0’ is always true [-Wtype-limits] 224 | if (__wc >= 0 && __wc < 128 && _M_narrow_ok) | ~~~~~^~~~ ctype_members.cc: In member function ‘virtual const wchar_t* std::ctype<wchar_t>::do_narrow(const wchar_t*, const wchar_t*, char, char*) const’: ctype_members.cc:247:21: warning: comparison of unsigned expression in ‘>= 0’ is always true [-Wtype-limits] 247 | if (*__lo >= 0 && *__lo < 128) | ~~~~~~^~~~ This introduces a helper function that converts the wchar_t to an unsigned type and then does the comparison. This means the comparison is not target-dependent, and there's no more warning. libstdc++-v3/ChangeLog: * config/locale/gnu/ctype_members.cc (use_table): New function. (ctype<wchar_t>::do_narrow): Use use_table. Reviewed-by: Tomasz Kamiński <[email protected]> Diff: --- libstdc++-v3/config/locale/gnu/ctype_members.cc | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/libstdc++-v3/config/locale/gnu/ctype_members.cc b/libstdc++-v3/config/locale/gnu/ctype_members.cc index 183babb6c3f6..b34446a61ee1 100644 --- a/libstdc++-v3/config/locale/gnu/ctype_members.cc +++ b/libstdc++-v3/config/locale/gnu/ctype_members.cc @@ -217,11 +217,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION return __hi; } + // True if c can be looked up in _M_narrow. + [[gnu::always_inline]] + static inline bool + use_table(wchar_t c) + { + using U = std::make_unsigned<wchar_t>::type; + return U(c) < 128; + } + char ctype<wchar_t>:: do_narrow(wchar_t __wc, char __dfault) const { - if (__wc >= 0 && __wc < 128 && _M_narrow_ok) + if (use_table(__wc) && _M_narrow_ok) return _M_narrow[__wc]; #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __c_locale __old = __uselocale(_M_c_locale_ctype); @@ -244,7 +253,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (_M_narrow_ok) while (__lo < __hi) { - if (*__lo >= 0 && *__lo < 128) + if (use_table(*__lo)) *__dest = _M_narrow[*__lo]; else {
