From: Thomas Schwinge Date: Sat, 4 Jul 2026 10:06:41 +0000 (+0000) Subject: libstdc++: Avoid '-Wtype-limits' warnings in 'libstdc++-v3/config/locale/generic... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=172dc0ed63274f24653f830754a6d49e37bfc3fe;p=thirdparty%2Fgcc.git libstdc++: Avoid '-Wtype-limits' warnings in 'libstdc++-v3/config/locale/generic/ctype_members.cc' In a GCC/AIX build I ran into: ctype_members.cc: In member function 'virtual char std::ctype::do_narrow(wchar_t, char) const': ctype_members.cc:212:14: error: comparison is always true due to limited range of data type [-Werror=type-limits] 212 | if (__wc >= 0 && __wc < 128 && _M_narrow_ok) | ~~~~~^~~~ ctype_members.cc: In member function 'virtual const wchar_t* std::ctype::do_narrow(const wchar_t*, const wchar_t*, char, char*) const': ctype_members.cc:226:21: error: comparison is always true due to limited range of data type [-Werror=type-limits] 226 | if (*__lo >= 0 && *__lo < 128) | ~~~~~~^~~~ cc1plus: all warnings being treated as errors make[5]: *** [Makefile:685: ctype_members.lo] Error 1 make[5]: Target 'all' not remade because of errors. make[5]: Leaving directory '[...]/build-gcc/powerpc-ibm-aix7.3.1.0/libstdc++-v3/src/c++11' That's '[...]/ctype_members.cc' -> '[...]/source-gcc/libstdc++-v3/config/locale/generic/ctype_members.cc'. Apply to that file the very same patch as had been applied to 'libstdc++-v3/config/locale/gnu/ctype_members.cc' in commit 975025de350bb8cc264fef0a5f88f71abe5b3791 "libstdc++: Avoid -Wtype-limits warnings in locale/gnu/ctype_members.cc". libstdc++-v3/ * config/locale/generic/ctype_members.cc (use_table): New function. (ctype::do_narrow): Use use_table. Co-authored-by: Jonathan Wakely --- diff --git a/libstdc++-v3/config/locale/generic/ctype_members.cc b/libstdc++-v3/config/locale/generic/ctype_members.cc index 2d61347feb1..3f788a63e20 100644 --- a/libstdc++-v3/config/locale/generic/ctype_members.cc +++ b/libstdc++-v3/config/locale/generic/ctype_members.cc @@ -205,11 +205,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::type; + return U(c) < 128; + } + char ctype:: 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]; const int __c = wctob(__wc); return (__c == EOF ? __dfault : static_cast(__c)); @@ -223,7 +232,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 {