On Mon, 6 Jul 2026, 07:56 Thomas Schwinge, <[email protected]> wrote:

> In a GCC/AIX build I ran into:
>
>     ctype_members.cc: In member function 'virtual char
> std::ctype<wchar_t>::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<wchar_t>::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".
>

OK, thanks


>         libstdc++-v3/
>         * config/locale/generic/ctype_members.cc (use_table): New function.
>         (ctype<wchar_t>::do_narrow): Use use_table.
>
> Co-authored-by: Jonathan Wakely <[email protected]>
> ---
>  libstdc++-v3/config/locale/generic/ctype_members.cc | 13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
>
> 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<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];
>      const int __c = wctob(__wc);
>      return (__c == EOF ? __dfault : static_cast<char>(__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
>             {
> --
> 2.53.0
>
>

Reply via email to