aboutsummaryrefslogtreecommitdiff
path: root/lib/stdbool_.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/stdbool_.h')
-rw-r--r--lib/stdbool_.h54
1 files changed, 33 insertions, 21 deletions
diff --git a/lib/stdbool_.h b/lib/stdbool_.h
index e33715a6..7cd2da84 100644
--- a/lib/stdbool_.h
+++ b/lib/stdbool_.h
@@ -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 <haible@clisp.cons.org>, 2001.
This program is free software; you can redistribute it and/or modify
@@ -13,7 +13,7 @@
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software Foundation,
- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
#ifndef _STDBOOL_H
#define _STDBOOL_H
@@ -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 !@HAVE__BOOL@
-# 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. */