[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Bug-gnulib] stdbool_.h bug breaks coreutils CVS sort on Alpha GCC 2
From: |
Bruno Haible |
Subject: |
Re: [Bug-gnulib] stdbool_.h bug breaks coreutils CVS sort on Alpha GCC 2.95.4 |
Date: |
Mon, 11 Aug 2003 14:34:04 +0200 |
User-agent: |
KMail/1.5 |
Paul Eggert wrote:
> More practically, do you know of any important C99 platforms where
> sizeof (_Bool) isn't 1?
IIRC (very vague reminiscence), the early 'bool' support in some C++
compilers had a sizeof > 1.
> here is a simpler way to get it to work as desired:
>
> enum { bool_is_signed = -1, false, true };
Cool!! I'm taking this approach now.
> It might be helpful to describe the precise subset of C99 <stdbool.h>
> that is implemented correctly. How about this for a first cut?
Good idea, I've added your comments with some tweaks.
Bruno
2003-08-11 Bruno Haible <address@hidden>
* stdbool_.h (_Bool): Undo last change; instead use a negative enum
value to ensure that _Bool promotes to int. Use #define for _Bool when
using the Solaris C compiler. Adds comments suggested by Paul Eggert.
diff -c -3 -r1.3 stdbool_.h
*** lib/stdbool_.h 5 Aug 2003 19:29:51 -0000 1.3
--- lib/stdbool_.h 11 Aug 2003 12:28:27 -0000
***************
*** 20,25 ****
--- 20,56 ----
/* ISO C 99 <stdbool.h> for platforms that lack it. */
+ /* Usage suggestions:
+
+ Programs that use <stdbool.h> should be aware of some limitations
+ and standards compliance issues.
+
+ Standards compliance:
+
+ - <stdbool.h> must be #included before 'bool', 'false', 'true'
+ can be used.
+
+ - You cannot assume that sizeof (bool) == 1.
+
+ - Programs should not undefine the macros bool, true, and false,
+ as C99 lists that as an "obsolescent feature".
+
+ Limitations of this substitute, when used in a C89 environment:
+
+ - <stdbool.h> must be #included before the '_Bool' type can be used.
+
+ - You cannot assume that _Bool is a typedef; it might be a macro.
+
+ - In C99, casts and automatic conversions to '_Bool' or 'bool' are
+ performed in such a way that every nonzero value gets converted
+ to 'true', and zero gets converted to 'false'. This doesn't work
+ with this substitute. With this substitute, only the values 0 and 1
+ give the expected result when converted to _Bool' or 'bool'.
+
+ Also, it is suggested that programs use 'bool' rather than '_Bool';
+ this isn't required, but 'bool' is more common. */
+
+
/* 7.16. Boolean type and values */
/* BeOS <sys/socket.h> already #defines false 0, true 1. We use the same
***************
*** 36,46 ****
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)). */
#ifndef __cplusplus
# if address@hidden@
enum { false = 0, true = 1 };
! typedef signed char _Bool;
# endif
#else
typedef bool _Bool;
--- 67,83 ----
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'. */
#ifndef __cplusplus
# if address@hidden@
+ # 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
# endif
#else
typedef bool _Bool;