From 1a9e9d670d66f4e41f86720eabbf15775fe31812 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 25 Jan 2006 18:32:19 +0000 Subject: (true, false) [defined __BEOS__]: undef, as before. (_Bool) [!@HAVE__BOOL@ && defined __GNUC__]: Use an enum rather than a #define. --- lib/stdbool_.h | 69 ++++++++++++++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 28 deletions(-) (limited to 'lib/stdbool_.h') 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 , 2001. This program is free software; you can redistribute it and/or modify @@ -54,47 +54,60 @@ /* 7.16. Boolean type and values */ /* BeOS 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 /* 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 - 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 , + 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 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 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 + 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. */ -- cgit v1.2.3-54-g00ecf