Richard Stallman <[EMAIL PROTECTED]> writes: > In Emacs we have a macro that tends to produce the warning > > comparison is always false due to limited range of data type > > when compiling for 64-bit machines. EMACS_INT is 64 bits > in that case. Here is the macro: > > #define FIXNUM_OVERFLOW_P(i) \ > ((EMACS_INT)(i) > MOST_POSITIVE_FIXNUM \ > || (EMACS_INT) (i) < MOST_NEGATIVE_FIXNUM) > > When this macro is used on an expression that has type int, it > produces those warnings, and there is no way to change the macro to > prevent the warnings. We used the workaround of copying the > expression into an EMACS_INT in a previous statement, but that is > cumbersome and ugly.
gcc has issued this warning for quite a while. It has been around at least since this change: Sun Apr 17 01:21:35 1988 Richard Stallman (rms at frosted-flakes.ai.mit.edu) * typecheck.c (shorten_compare): Warn about constant result only in cases like (char)x < 0x80, where old C compilers made it -0x80. I'm not sure whether anything has changed in this area to cause the warnings to appear more frequently today. > Is there a way to write the macro so as to suppress this warning? You can avoid it by using unsigned types. I think that something like this will do the trick: #define FIXNUM_OVERFLOW_P(i) \ ((unsigned long long)(i) > MOST_POSITIVE_FIXNUM \ && (unsigned long long)(i) < MOST_NEGATIVE_FIXNUM) Ian