https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105775

            Bug ID: 105775
           Summary: GCC uses an invalid assumption in numeric limits of
                    char
           Product: gcc
           Version: og11 (devel/omp/gcc-11)
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dante19031999 at gmail dot com
  Target Milestone: ---

On my system char is defined as a signed char which means that the limit is
indeed 127.
However in the C standard it is false, therefor there is an error.
This affects the use of the code for cross platform purposes.
Most probably you will find the complementary error in platforms where char is
defined as unsigned char giving the warning on cChar >= 0.
The error can be avoided to a certain extent with #if CHAR_MIN < 0 or
conversion to unsigned char...
The code shown here is a simplified version of the original made for the
purpose of the bug report.

According to cppreference:
signed char - type for signed character representation.
unsigned char - type for unsigned character representation. Also used to
inspect object representations (raw memory). 
char - type for character representation. Equivalent to either signed char or
unsigned char (which one is implementation-defined and may be controlled by a
compiler command line switch), but char is a distinct type, different from both
signed char and unsigned char.

./inc/ascii.h: In function 'is_ascii':
./inc/ascii.h:13:89: error: comparison is always true due to limited range of
data type [-Werror=type-limits]
   13 | __FULL_INLINE inline bool is_ascii( char cChar){return cChar >= 0 &&
cChar <= 127;}
      |                                                                        
   ^~
./inc/ascii.h: In function 'is_ascii_printable':
./inc/ascii.h:17:94: error: comparison is always true due to limited range of
data type [-Werror=type-limits]
   17 | __FULL_INLINE inline bool is_ascii_printable( char cChar){return cChar
>= 32 && cChar <= 127;}
      |                                                                        
              ^~
cc1: some warnings being treated as errors

#define __FULL_INLINE         __attribute__((__const__))
__attribute__((__nothrow__)) __attribute__((__always_inline__))

gcc -x c -std=c17 -Wimplicit-function-declaration -pipe -Werror=format-security
-Wextra -Wall -pedantic -frounding-math -fsignaling-nans -Werror=narrowing
-fPIC -Wunused-variable -Wunused-value -Wunused-but-set-variable -Og -std=gnu17
-I./ascii.h -c ./ascii.c -o ./instdir/ascii.c.o

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/11/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-redhat-linux
Configured with: ../configure --enable-bootstrap
--enable-languages=c,c++,fortran,objc,obj-c++,ada,go,d,lto --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared
--enable-threads=posix --enable-checking=release --enable-multilib
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-gnu-unique-object --enable-linker-build-id
--with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin
--enable-initfini-array
--with-isl=/builddir/build/BUILD/gcc-11.3.1-20220421/obj-x86_64-redhat-linux/isl-install
--enable-offload-targets=nvptx-none --without-cuda-driver
--enable-gnu-indirect-function --enable-cet --with-tune=generic
--with-arch_32=i686 --build=x86_64-redhat-linux
--with-build-config=bootstrap-lto --enable-link-serialization=1
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)

Reply via email to