Hi Paul, Paul Eggert wrote on 2007-10-16: > Thanks for verifying this. I have started by installing the following > fix to Autoconf, and will follow up on gnulib shortly. > > 2007-10-16 Paul Eggert <[EMAIL PROTECTED]> > > Check for 64-bit int errors in HP-UX 10.20 preprocessor.
It exists also in the HP-UX 11.00 preprocessor. > Problem reported by H.Merijn Brand in > <http://lists.gnu.org/archive/html/bug-tar/2007-10/msg00018.html>. > * lib/autoconf/types.m4 (AC_TYPE_LONG_LONG_INT): > (AC_TYPE_UNSIGNED_LONG_LONG_INT): > Check that preprocessor handles 64-bit ints, too. The effect is that one of these tests says yes, and the other says no. Using the stdint.h from gnulib, one then has this: $ cat foo.c #include "config.h" #include <stdio.h> #include <stdint.h> uint64_t uu; int64_t ii; int main () { fprintf(stderr, "intmax_t size = %d\n", sizeof (intmax_t)); fprintf(stderr, "uintmax_t size = %d\n", sizeof (uintmax_t)); fprintf(stderr, "int64_t size = %d\n", sizeof (int64_t)); fprintf(stderr, "uint64_t size = %d\n", sizeof (uint64_t)); } $ cc -Ae -O -I.. -I. foo.c libgnu.a $ ./a.out intmax_t size = 8 uintmax_t size = 4 int64_t size = 8 uint64_t size = 8 Three things are not good here: 1) sizeof (uintmax_t) < sizeof (intmax_t). 2) sizeof (uintmax_t) < sizeof (uint64_t). 3) sizeof (uintmax_t) < 8. 1) is bad because much code assumes that every signed int can be losslessly casted into its corresponding unsigned counterpart. Also a lot of code assumes that sizeof (uintmax_t) == sizeof (intmax_t). One such code is gnulib's vasnprintf: it assumes that %jd and %ju take as argument an integer of the same size. In this situation it does not do so any more, and the unit test of the 'fprintf-posix' module fails. 2) is bad because a lot code assumes that every unsigned scalar integer type can be losslessly casted to uintmax_t. 3) is bad because ISO C 99 requires the existence of an uint_least64_t type; thus 64-bit types should be commonplace. So the change fixed one problem but opened up three other problems. What are the options? A) Accept the fact that although 64-bit types may be known to the compiler, they may not portably be used in preprocessor expressions. This means: - In the autoconf tests: undo the last change. - In gnulib's stdint.h and inttypes.h: Compare the values of UINTMAX_MAX etc. at configure time, rather than at compile time in the preprocessor. B) Turn off the 64-bit types of HP-UX 11 cc. This means: - Change AC_TYPE_LONG_LONG_INT so that it says "no" whenever AC_TYPE_UNSIGNED_LONG_LONG_INT says "no". - Add a "#define int64_t unusable_int64_t" and "#define uint64_t unusable_uint64_t" to config.h, also as part of AC_TYPE_LONG_LONG_INT and AC_TYPE_UNSIGNED_LONG_LONG_INT. C) Some other option I'm missing? Bruno