summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2006-01-25 18:32:19 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2006-01-25 18:32:19 +0000
commit1a9e9d670d66f4e41f86720eabbf15775fe31812 (patch)
tree41045cb37096ad2d0532c28c9de8de895ee6e678
parentf3c2752caa931a25ffe68f7de801ea5454091da7 (diff)
downloadcoreutils-1a9e9d670d66f4e41f86720eabbf15775fe31812.tar.xz
(true, false) [defined __BEOS__]: undef, as before.
(_Bool) [!@HAVE__BOOL@ && defined __GNUC__]: Use an enum rather than a #define.
-rw-r--r--lib/stdbool_.h69
1 files changed, 41 insertions, 28 deletions
diff --git a/lib/stdbool_.h b/lib/stdbool_.h
index 7cd2da840..1c12c69ca 100644
--- a/lib/stdbool_.h
+++ b/lib/stdbool_.h
@@ -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
@@ -54,47 +54,60 @@
/* 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. */