On Mon, 30 Sept 2024, 01:58 Hans-Peter Nilsson, <h...@axis.com> wrote:

> FWIW, I see "typedef char mask;" also for bionic and
> openbsd.  Tested for cris-elf.
>
> Ok to commit?
>

OK thanks



> -- >8 --
> There are 100+ regressions when running the g++ testsuite for newlib
> targets (probably excepting ARM-based ones) e.g cris-elf after commit
> r15-3859-g63a598deb0c9fc "libstdc++: #ifdef out #pragma GCC
> system_header", which effectively no longer silences warnings for
> gcc-installed system headers.  Some of these regressions are fixed by
> r15-3928.  For the remaining ones, there's in g++.log:
>
> FAIL: g++.old-deja/g++.robertl/eb79.C  -std=c++26 (test for excess errors)
> Excess errors:
> /gccobj/cris-elf/libstdc++-v3/include/cris-elf/bits/ctype_base.h:50:53: \
>  warning: overflow in conversion from 'int' to 'std::ctype_base::mask' \
>  {aka 'char'} changes value from '151' to '-105' [-Woverflow]
>
> This is because the _B macro in newlib's ctype.h (from where the
> "_<letter>" macros come) is bit 7, the sign-bit of 8-bit types:
>
> #define _B      0200
>
> Using it in an int-expression that is then truncated to 8 bits will
> "change" the value to negative for a default-signed char.  If this
> code was created from scratch, it should have been an unsigned type,
> however it's not advisable to change the type of mask as this affects
> the API.  The least ugly option seems to be to silence the warning by
> explict casts in the initializer, and for consistency, doing it for
> all members.
>
>         PR libstdc++/116895
>         * config/os/newlib/ctype_base.h: Avoid signed-overflow warnings by
>         explicitly casting initializer expressions to mask.
> ---
>  libstdc++-v3/config/os/newlib/ctype_base.h | 24 +++++++++++-----------
>  1 file changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/libstdc++-v3/config/os/newlib/ctype_base.h
> b/libstdc++-v3/config/os/newlib/ctype_base.h
> index 309fdeea7731..5ec43a0c6803 100644
> --- a/libstdc++-v3/config/os/newlib/ctype_base.h
> +++ b/libstdc++-v3/config/os/newlib/ctype_base.h
> @@ -41,19 +41,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
>      // NB: Offsets into ctype<char>::_M_table force a particular size
>      // on the mask type. Because of this, we don't use an enum.
>      typedef char               mask;
> -    static const mask upper            = _U;
> -    static const mask lower    = _L;
> -    static const mask alpha    = _U | _L;
> -    static const mask digit    = _N;
> -    static const mask xdigit   = _X | _N;
> -    static const mask space    = _S;
> -    static const mask print    = _P | _U | _L | _N | _B;
> -    static const mask graph    = _P | _U | _L | _N;
> -    static const mask cntrl    = _C;
> -    static const mask punct    = _P;
> -    static const mask alnum    = _U | _L | _N;
> +    static const mask upper            = mask (_U);
> +    static const mask lower    = mask (_L);
> +    static const mask alpha    = mask (_U | _L);
> +    static const mask digit    = mask (_N);
> +    static const mask xdigit   = mask (_X | _N);
> +    static const mask space    = mask (_S);
> +    static const mask print    = mask (_P | _U | _L | _N | _B);
> +    static const mask graph    = mask (_P | _U | _L | _N);
> +    static const mask cntrl    = mask (_C);
> +    static const mask punct    = mask (_P);
> +    static const mask alnum    = mask (_U | _L | _N);
>  #if __cplusplus >= 201103L
> -    static const mask blank    = space;
> +    static const mask blank    = mask (space);
>  #endif
>    };
>
> --
> 2.30.2
>
>

Reply via email to