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.

Is there a way to write the macro so as to suppress this warning?

If not, I think one ought to be implemented.  I have a suggestion for
what it could look like:

#define FIXNUM_OVERFLOW_P(i) \
  ((EMACS_INT)(int)(i) > MOST_POSITIVE_FIXNUM \
   || (EMACS_INT)(int)(i) < MOST_NEGATIVE_FIXNUM)

The casts to int could be interpreted as meaning "yes I know this is
limited to the range of of ints, so don't warn me about the
consequences of that fact."

Please respond.

Reply via email to