On Solaris 9 with gcc 4.6.4, it is surprising to see that the test program
(from stdint.m4) fails and thus gnulib provides an <stdint.h> replacement,
but the original <stdint.h> does not actually exhibit the bug which the
test program reports.

More precisely, config.log reports this outcome of the test program:

configure:22117: checking whether stdint.h conforms to C99
configure:22292: gcc -O2 -c -g -O2 -I/home/haible/prefix-sparc32/include -Wall 
-D_REENTRANT conftest.c >&5
conftest.c:246:52: error: expected expression before '?' token
conftest.c:246:52: error: bit-field 'check_uintptr' width not an integer 
constant

So it's this statement (in a struct):
int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;

But the program
=============================================================
#include <stdint.h>
struct s {
  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
};
=============================================================
compiles fine!

What's going on? There is a system include file
/usr/include/sys/int_limits.h
which overwrites INTPTR_MAX and UINTPTR_MAX with empty values:

#define INTPTR_MAX
#define UINTPTR_MAX

and this system include file gets included by <limits.h> and <inttypes.h>.
As a consequence the following programs fail to compile:

=============================================================
#include <stdint.h>
#include <limits.h>
struct s {
  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
};
=============================================================
#include <stdint.h>
#include <inttypes.h>
struct s {
  int check_uintptr: (uintptr_t) -1 == UINTPTR_MAX ? 1 : -1;
};
=============================================================

But the following sequences of includes do define UINTPTR_MAX correctly:

#include <stdint.h>

#include <limits.h>
#include <stdint.h>

#include <inttypes.h>
#include <stdint.h>

#include <limits.h>
#include <stdint.h>
#include <limits.h>

#include <limits.h>
#include <stdint.h>
#include <inttypes.h>

So, the reason why <stdint.h> is found to be nonconforming by the stdint.m4
test is that it happens to include <limits.h> at the "right" moment.

Something worth documenting:


2016-12-10  Bruno Haible  <br...@clisp.org>

        stdint: Update doc about Solaris 9.
        * doc/posix-headers/stdint.texi: Add info about Solaris 9.

diff --git a/doc/posix-headers/stdint.texi b/doc/posix-headers/stdint.texi
index d5ca3c2..03542c1 100644
--- a/doc/posix-headers/stdint.texi
+++ b/doc/posix-headers/stdint.texi
@@ -24,6 +24,11 @@ The values of @code{INT8_MAX}, @code{UINT8_MAX} etc. are not 
usable in
 preprocessor expressions on some platforms:
 HP-UX 11.23.
 @item
+The values of @code{INTPTR_MAX} and @code{UINTPTR_MAX}, although correctly
+defined in @code{<stdint.h>}, are replaced by empty values when
+@code{<limits.h>} or @code{<inttypes.h>} gets included later on some platforms:
+Solaris 9 with GCC 4.5 or newer.
+@item
 The macros @code{WCHAR_MIN} and @code{WCHAR_MAX} are not defined in
 @code{<stdint.h>} (only in @code{<wchar.h>}) on some platforms:
 Dragonfly, BSDI.


Reply via email to