changeset 4522:b2da55c5313c

Use a trick to ensure that _Bool can remain an enum and still promote to 'int'.
author Bruno Haible <bruno@clisp.org>
date Mon, 11 Aug 2003 12:34:07 +0000
parents 35feeb2d4811
children 6cc4874a100b
files lib/ChangeLog lib/stdbool_.h
diffstat 2 files changed, 45 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,9 @@
+2003-08-11  Bruno Haible  <bruno@clisp.org>
+
+	* 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.
+
 2003-08-10  Karl Berry  <karl@gnu.org>
 
 	* regex.h: update from libc (whitespace fix).
--- a/lib/stdbool_.h
+++ b/lib/stdbool_.h
@@ -20,6 +20,37 @@
 
 /* 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,11 +67,17 @@
    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)).  */
+   (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 !@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 };
-typedef signed char _Bool;
+#  else
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+#  endif
 # endif
 #else
 typedef bool _Bool;