From d77c9cd8c648ec0943a951c48b181651ae00421b Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sat, 2 Jun 2007 20:45:23 +0000 Subject: [PATCH] Fix incorrect values of SIG_ATOMIC_MIN, SIG_ATOMIC_MAX on FreeBSD/ia64. --- ChangeLog | 8 ++++++++ doc/headers/stdint.texi | 7 +++++++ m4/stdint.m4 | 36 +++++++++++++++++++++++++++--------- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/ChangeLog b/ChangeLog index b79f1dfb99..c9fa72a4fe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2007-06-02 Bruno Haible + + 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 * tests/test-binary-io.c (main): Pass a third argument to open(). diff --git a/doc/headers/stdint.texi b/doc/headers/stdint.texi index 234a6e0be4..c264692a4a 100644 --- a/doc/headers/stdint.texi +++ b/doc/headers/stdint.texi @@ -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: diff --git a/m4/stdint.m4 b/m4/stdint.m4 index 3de7e136a4..d902a4163f 100644 --- a/m4/stdint.m4 +++ b/m4/stdint.m4 @@ -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 /* 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: -- 2.30.2