diff options
Diffstat (limited to 'lib/stdbool_.h')
-rw-r--r-- | lib/stdbool_.h | 54 |
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. */ |