Including <limits.h> in gmp-impl.h

Marc Glisse marc.glisse at
Wed Dec 25 11:03:40 UTC 2013


trying to compile gmp with clang, I got this error in the C++ testsuite:

In file included from /usr/include/limits.h:152:
/usr/include/x86_64-linux-gnu/bits/xopen_lim.h:97:7: error: token is not a valid
       binary operator in a preprocessor subexpression
#  if INT_MAX == 2147483647
/data/repos/gmp/gmp-impl.h:579:31: note: expanded from macro 'INT_MAX'
#define INT_MAX            (-(INT_MIN+1))
/data/repos/gmp/gmp-impl.h:576:35: note: expanded from macro 'INT_MIN'
#define INT_MIN            ((int) UINT_HIGHBIT)
                             ~~~~~ ^
/data/repos/gmp/gmp-impl.h:564:28: note: expanded from macro 
#define UINT_HIGHBIT       (UINT_MAX ^ ((unsigned) UINT_MAX >> 1))

Something in the glibc headers doesn't like the gmp definitions of those 
macros. It is easily worked around by including limits.h in gmp-impl.h, 
but I see this comment:

/* limits.h is not used in general, since it's an ANSI-ism, and since on
    solaris gcc 2.95 under -mcpu=ultrasparc in ABI=32 ends up getting wrong
    values (the ABI=64 values).

    On Cray vector systems, however, we need the system limits.h since sizes
    of signed and unsigned types can differ there, depending on compiler
    options (eg. -hnofastmd), making our SHRT_MAX etc expressions fail.  For
    reference, int can be 46 or 64 bits, whereas uint is always 64 bits; and
    short can be 24, 32, 46 or 64 bits, and different for ushort.  */

#if defined _CRAY
#include <limits.h>

So even using autoconf to check if limits.h exists may not be enough. Or 
can we ignore the old solaris issue?

Marc Glisse

More information about the gmp-devel mailing list