[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
proposed stdbool fixes for AIX, HP-UX, and now IRIX
From: |
Paul Eggert |
Subject: |
proposed stdbool fixes for AIX, HP-UX, and now IRIX |
Date: |
Thu, 19 Jan 2006 17:12:56 -0800 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
While looking into an old Bison bug report for IRIX I noticed that it
would be fixed by the stdbool patches that have been suggested for
gnulib. Any objections if I install them? Here they are again.
They've been used in coreutils CVS for some time.
2005-12-13 Paul Eggert <address@hidden>
* m4stdbool.m4 (AC_HEADER_STDBOOL): Catch a bug in IBM AIX xlc
compiler version 6.0.0.0.
2005-11-25 Paul Eggert <address@hidden>
* lib/stdbool_.h: Simplify greatly, under the assumption that these
days most people use C99-compatible compilers to debug, so it's
not worth worrying about catering to older compilers for that.
This works around some porting problems with HP-UX compilers.
(false, true) [defined __BEOS__]: Don't #undef; no longer needed.
(_Bool): typedef to bool if C++ or BeOS, and #define to signed char
otherwise.
--- gnulib/lib/stdbool_.h 2005-05-13 23:03:58.000000000 -0700
+++ cu/lib/stdbool_.h 2005-12-13 11:42:27.000000000 -0800
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
Written by Bruno Haible <address@hidden>, 2001.
This program is free software; you can redistribute it and/or modify
@@ -54,35 +54,47 @@
/* 7.16. Boolean type and values */
/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
- definitions below, but temporarily we have to #undef them. */
+ definitions below, which is OK. */
#ifdef __BEOS__
# include <OS.h> /* defines bool but not _Bool */
-# undef false
-# undef true
#endif
-/* For the sake of symbolic names in gdb, we define true and false as
- enum constants, not only as macros.
- It is tempting to write
- typedef enum { false = 0, true = 1 } _Bool;
- so that gdb prints values of type 'bool' symbolically. But if we do
+/* C++ and BeOS have a reliable bool (and _Bool, if it exists).
+ Otherwise, since this file is being compiled, the system
+ <stdbool.h> is not reliable so assume that the system _Bool is not
+ reliable either. Under that assumption, it is tempting to write
+
+ typedef enum { false, true } _Bool;
+
+ so that gdb prints values of type 'bool' symbolically. But if we do
this, values of type '_Bool' may promote to 'int' or 'unsigned int'
(see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int'
- (see ISO C 99 6.3.1.1.(2)). So we add a negative value to the
- enum; this ensures that '_Bool' promotes to 'int'. */
-#if !(defined __cplusplus || defined __BEOS__)
+ (see ISO C 99 6.3.1.1.(2)). We could instead try this:
+
+ typedef enum { _Bool_dummy = -1, false, true } _Bool;
+
+ as the negative value ensures that '_Bool' promotes to 'int'.
+ However, this runs into some other problems. First, Sun's C
+ compiler when (__SUNPRO_C < 0x550 || __STDC__ == 1) issues a stupid
+ "warning: _Bool is a keyword in ISO C99". Second, IBM's AIX cc
+ compiler 6.0.0.0 (and presumably other versions) mishandles
+ subscripts involving _Bool (effectively, _Bool promotes to unsigned
+ int in this case), and we need to redefine _Bool in that case.
+ Third, HP-UX 10.20's C compiler lacks <stdbool.h> but has _Bool and
+ mishandles comparisons of _Bool to int (it promotes _Bool to
+ unsigned int).
+
+ The simplest way to work around these problems is to ignore any
+ existing definition of _Bool and use our own. */
+
+#if defined __cplusplus || defined __BEOS__
# if address@hidden@
-# if defined __SUNPRO_C && (__SUNPRO_C < 0x550 || __STDC__ == 1)
- /* Avoid stupid "warning: _Bool is a keyword in ISO C99". */
-# define _Bool signed char
-enum { false = 0, true = 1 };
-# else
-typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
-# endif
+typedef bool _Bool;
# endif
#else
-typedef bool _Bool;
+# define _Bool signed char
#endif
+
#define bool _Bool
/* The other macros must be usable in preprocessor directives. */
--- gnulib/m4/stdbool.m4 2005-10-17 11:06:51.000000000 -0700
+++ cu/m4/stdbool.m4 2005-12-13 17:17:28.000000000 -0800
@@ -74,11 +74,31 @@ AC_DEFUN([AC_HEADER_STDBOOL],
_Bool n[m];
char o[sizeof n == m * sizeof n[0] ? 1 : -1];
char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
+ #if defined __xlc__ || __GNUC__
+ /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0
+ reported by James Lemley on 2005-10-05; see
+
<http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html>.
+ This test is not quite right, since xlc is allowed to
+ reject this program, as the initializer for xlcbug is
+ not one of the forms that C requires support for.
+ However, doing the test right would require a run-time
+ test, and that would make cross-compilation harder.
+ Let us hope that IBM fixes the xlc bug, and also adds
+ support for this kind of constant expression. In the
+ meantime, this test will reject xlc, which is OK, since
+ our stdbool.h substitute should suffice. */
+ char digs[] = "0123456789";
+ int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1);
+ #endif
+ _Bool q = true;
+ _Bool *pq = &q;
],
[
+ *pq |= q;
+ *pq |= ! q;
/* Refer to every declared value, to avoid compiler optimizations. */
return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
- + !m + !n + !o + !p);
+ + !m + !n + !o + !p + !q + !pq);
],
[ac_cv_header_stdbool_h=yes],
[ac_cv_header_stdbool_h=no])])
- proposed stdbool fixes for AIX, HP-UX, and now IRIX,
Paul Eggert <=
- Re: [bug-gnulib] proposed stdbool fixes for AIX, HP-UX, and now IRIX, Bruno Haible, 2006/01/24
- Re: [bug-gnulib] proposed stdbool fixes for AIX, HP-UX, and now IRIX, Paul Eggert, 2006/01/25
- Re: proposed stdbool fixes for AIX, HP-UX, and now IRIX, Bruno Haible, 2006/01/25
- Re: proposed stdbool fixes for AIX, HP-UX, and now IRIX, Paul Eggert, 2006/01/25
- Re: proposed stdbool fixes for AIX, HP-UX, and now IRIX, Bruno Haible, 2006/01/26
- Re: proposed stdbool fixes for AIX, HP-UX, and now IRIX, Paul Eggert, 2006/01/26