Fix incorrect values of SIG_ATOMIC_MIN, SIG_ATOMIC_MAX on FreeBSD/ia64.
authorBruno Haible <bruno@clisp.org>
Sat, 2 Jun 2007 20:45:23 +0000 (20:45 +0000)
committerBruno Haible <bruno@clisp.org>
Sat, 2 Jun 2007 20:45:23 +0000 (20:45 +0000)
ChangeLog
doc/headers/stdint.texi
m4/stdint.m4

index b79f1dfb99233f57b93cc265c20219563d0224c6..c9fa72a4fe4c46127d4e7df3cd653a4021da0ee5 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-06-02  Bruno Haible  <bruno@clisp.org>
+
+       Fix test-stdint failure on FreeBSD/ia64.
+       * m4/stdint.m4 (gl_STDINT_H): Check the values of PTRDIFF_MIN,
+       PTRDIFF_MAX, SIG_ATOMIC_MIN, SIG_ATOMIC_MAX, SIZE_MAX, WCHAR_MIN,
+       WCHAR_MAX, WINT_MIN, WINT_MAX entirely, not only for plausibility.
+       * doc/headers/stdint.texi: Update.
+
 2007-06-01  Bruno Haible  <bruno@clisp.org>
 
        * tests/test-binary-io.c (main): Pass a third argument to open().
index 234a6e0be45c9e605404f21d3bda33de92ea196d..c264692a4a55d4404d575edbd71126f0d982c3bf 100644 (file)
@@ -12,6 +12,13 @@ This header file is missing on some platforms:
 OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Interix 3.5, BeOS.
 @item
 This header file is very incomplete on some platforms.
+@item
+The values of @code{SIG_ATOMIC_MIN} and @code{SIG_ATOMIC_MAX} are incorrect
+on some platforms:
+FreeBSD 6.2 / ia64.
+@item
+The value of @code{WINT_MAX} is incorrect on some platforms:
+mingw.
 @end itemize
 
 Portability problems not fixed by Gnulib:
index 3de7e136a423f1da0ecdeac5ee755b388b22e706..d902a4163f1fa405931f694d7304d79b8fe898ea 100644 (file)
@@ -1,5 +1,5 @@
-# stdint.m4 serial 24
-dnl Copyright (C) 2001-2002, 2004-2007 Free Software Foundation, Inc.
+# stdint.m4 serial 25
+dnl Copyright (C) 2001-2007 Free Software Foundation, Inc.
 dnl This file is free software; the Free Software Foundation
 dnl gives unlimited permission to copy and/or distribute it,
 dnl with or without modifications, as long as this notice is preserved.
@@ -142,14 +142,32 @@ uintptr_t h = UINTPTR_MAX;
 #endif
 intmax_t i = INTMAX_MAX;
 uintmax_t j = UINTMAX_MAX;
+
+#include <limits.h> /* for CHAR_BIT */
+#define TYPE_MINIMUM(t) \
+  ((t) ((t) 0 < (t) -1 ? (t) 0 : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+#define TYPE_MAXIMUM(t) \
+  ((t) ((t) 0 < (t) -1 ? (t) -1 : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
 struct s {
-  int check_PTRDIFF: PTRDIFF_MIN < (ptrdiff_t) 0 && (ptrdiff_t) 0 < PTRDIFF_MAX ? 1 : -1;
-  int check_SIG_ATOMIC: SIG_ATOMIC_MIN <= (sig_atomic_t) 0 && (sig_atomic_t) 0 < SIG_ATOMIC_MAX ? 1 : -1;
-  int check_SIZE: (size_t) 0 < SIZE_MAX ? 1 : -1;
-  int check_WCHAR: WCHAR_MIN <= (wchar_t) 0 && (wchar_t) 0 < WCHAR_MAX ? 1 : -1;
-  int check_WINT: WINT_MIN <= (wint_t) 0 && (wint_t) 0 < WINT_MAX
-                  && (WINT_MIN < (wint_t) 0 || (wint_t) -1 == (wint_t) WINT_MAX)
-                  ? 1 : -1;
+  int check_PTRDIFF:
+      PTRDIFF_MIN == TYPE_MINIMUM (ptrdiff_t)
+      && PTRDIFF_MAX == TYPE_MAXIMUM (ptrdiff_t)
+      ? 1 : -1;
+  /* Detect bug in FreeBSD 6.0 / ia64.  */
+  int check_SIG_ATOMIC:
+      SIG_ATOMIC_MIN == TYPE_MINIMUM (sig_atomic_t)
+      && SIG_ATOMIC_MAX == TYPE_MAXIMUM (sig_atomic_t)
+      ? 1 : -1;
+  int check_SIZE: SIZE_MAX == TYPE_MAXIMUM (size_t) ? 1 : -1;
+  int check_WCHAR:
+      WCHAR_MIN == TYPE_MINIMUM (wchar_t)
+      && WCHAR_MAX == TYPE_MAXIMUM (wchar_t)
+      ? 1 : -1;
+  /* Detect bug in mingw.  */
+  int check_WINT:
+      WINT_MIN == TYPE_MINIMUM (wint_t)
+      && WINT_MAX == TYPE_MAXIMUM (wint_t)
+      ? 1 : -1;
 
   /* Detect bugs in glibc 2.4 and Solaris 10 stdint.h, among others.  */
   int check_UINT8_C: