bug-gnulib
[Top][All Lists]
Advanced

[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])])





reply via email to

[Prev in Thread] Current Thread [Next in Thread]