https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91685
            Bug ID: 91685
           Summary: -Wtype-limits warns for constant expression
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: yann at droneaud dot fr
  Target Milestone: ---

I'm was trying to implement a test for socklen_t type signedness, because on
some platform it's signed and some it's unsigned. For signed socklen_t, I
wanted to rejected negative values.

I found following code triggers a warning:

    $ cat test.c

    #include <stdbool.h>

    bool test_unsigned(void)
    {
        return ((unsigned int)0 - 1) < 0;
    }

    $ gcc -O2 -Wall -Wextra -c test.c 
    warning: comparison of unsigned expression in '< 0' is always false
[-Wtype-limits]

According to the documentation for -Wtype-limits, this warning should not be
produced, because expression is constant:

> Warn if a comparison is always true or always false due to the limited range 
> of the data type, but do not warn for constant expressions. For example, warn 
> if an unsigned variable is compared against zero with < or >=. This warning 
> is also enabled by -Wextra. 

https://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/Warning-Options.html#index-Wtype-limits

I've made some tests on godbolt, see https://godbolt.org/z/b1QqIC and found
clang doesn't trigger the warning.

Perhaps warning here is welcomed and documentation should be updated ?

In the mean time, I still looking for a portable way to test if socklen_t is
negative on platform where it's signed ...

Reply via email to