]> git.ipfire.org Git - thirdparty/coreutils.git/commitdiff
(true, false) [defined __BEOS__]: undef, as before.
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 25 Jan 2006 18:32:19 +0000 (18:32 +0000)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 25 Jan 2006 18:32:19 +0000 (18:32 +0000)
(_Bool) [!@HAVE__BOOL@ && defined __GNUC__]: Use an enum
rather than a #define.

lib/stdbool_.h

index 7cd2da8406e1bc6ac795682bb98c3bea9310e66b..1c12c69ca6853381b54a25a12c730bb6fe26e8d7 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+/* Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
    Written by Bruno Haible <haible@clisp.cons.org>, 2001.
 
    This program is free software; you can redistribute it and/or modify
 /* 7.16. Boolean type and values */
 
 /* BeOS <sys/socket.h> already #defines false 0, true 1.  We use the same
-   definitions below, which is OK.  */
+   definitions below, but temporarily we have to #undef them.  */
 #ifdef __BEOS__
 # include <OS.h> /* defines bool but not _Bool */
+# undef false
+# undef true
 #endif
 
-/* 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
+/* 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
    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)).  We could instead try this:
-
-      typedef enum { _Bool_dummy = -1, false, true } _Bool;
+   (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'.  This works
+   with older GCC versions that do not have a working <stdbool.h>,
+   and it makes bool easier to to debug, so we use this with GCC.
 
-   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.  */
+   This approach into problems on some non-GCC platforms; the simplest
+   way to work around them is to ignore any existing definition of
+   _Bool and use our own.  */
 
 #if defined __cplusplus || defined __BEOS__
+  /* A compiler known to have 'bool'.  */
+  /* If the compiler already has both 'bool' and '_Bool', we can assume they
+     are the same types.  */
 # if !@HAVE__BOOL@
 typedef bool _Bool;
 # endif
 #else
-# define _Bool signed char
+# if @HAVE__BOOL@ || ! defined __GNUC__
+    /* The compiler has _Bool, or it is not GCC.  Recall that this
+       code is used only if <stdbool.h> does not work, so something is
+       odd if there is a _Bool.  */
+
+    /* Some HP-UX cc and AIX IBM C compiler versions have compiler bugs when
+       the built-in _Bool type is used.  See
+         http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
+         http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
+         http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html
+       With SunPRO C, avoid stupid
+         "warning: _Bool is a keyword in ISO C99".
+       With IRIX cc, avoid stupid
+         "warning(1185): enumerated type mixed with another type".
+       In general, there are enough problems with older compilers like
+       this that it's safer to avoid their _Bool entirely when
+       <stdbool.h> doesn't work.  */
+#  define _Bool signed char
+enum { false = 0, true = 1 };
+# else
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+# endif
 #endif
-
 #define bool _Bool
 
 /* The other macros must be usable in preprocessor directives.  */