GCC 3.3.1, new warnings with <limits>

Craig Rodrigues rodrigc at crodrigues.org
Sat Jul 12 20:12:16 PDT 2003

On Sat, Jul 12, 2003 at 09:50:21PM -0500, David Leimbach wrote:
> Heh that's because the offending macro __glibcpp_digits calls 
> __glibcpp_signed (T)
> on an unsigned type which does a < compareison.
> std::numeric_limits <signed long>::digits on a 32bit FBSD will yield 31 
> because its
> got 31 bits for magnitude.
> Unfortunately the way it seems to go about calculating that stuff at 
> compile time
> seems to be invalid due to the fact that it does < 0 compares on 
> unsigned types.
> Is this a gcc issue or a FBSD issue? [is this the original gcc c++ 
> header file or has
> it been tweaked?]


I think that this is a FreeBSD issue.  I compiled
the same file under Linux, with a GCC 3.3.1 checked out on 7/11
and did not encounter this warning.

I looked in the source code of gcc and found this:

   2597             case LT_EXPR:
   2598               if (extra_warnings && !in_system_header
   2599                   && ! (TREE_CODE (primop0) == INTEGER_CST
   2600                         && ! TREE_OVERFLOW (convert (c_common_signed_typ
e (type),
   2601                                                      primop0))))
   2602                 warning ("comparison of unsigned expression < 0 is alway
s false");
   2603               value = boolean_false_node;
   2604               break;

I am guessing that the C preprocessor does not think that it is
in a system header, and thus prints out the warning.

If I take the following preprocessed source (test.ii) and compile it
under FreeBSD with g++ -W -c test.ii:

# 1 "test.cc"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "test.cc"
# 1 "/usr/include/c++/3.3/iostream" 1 3
# 43 "/usr/include/c++/3.3/iostream" 3

static const int digits = (sizeof(unsigned int) * 8 - ((unsigned int)(-1) < 0));


I get:

In file included from test.cc:1:
/usr/include/c++/3.3/iostream:44: warning: comparison of unsigned expression < 
   0 is always false

If I compile the same file on my Linux box, with a gcc checked out
from the FSF CVS repository (gcc version 3.3.1 20030711 (prerelease)),
I do not get the warning.

I am not an expert on the GNU C preprocessor format, but I changed
two of the lines in the above file to:

# 1 "/usr/include/c++/3.3/iostream" 1 
# 43 "/usr/include/c++/3.3/iostream" 

and when I recompiled it under Linux, I also got the warning:

In file included from test.cc:1:
/usr/include/c++/3.3/iostream:44: warning: comparison of unsigned expression < 
   0 is always false

Any GCC/FreeBSD expert care to comment? ;)

Craig Rodrigues        
rodrigc at crodrigues.org

More information about the freebsd-current mailing list