Use a trick to ensure that _Bool can remain an enum and still promote
authorBruno Haible <bruno@clisp.org>
Mon, 11 Aug 2003 12:34:07 +0000 (12:34 +0000)
committerBruno Haible <bruno@clisp.org>
Mon, 11 Aug 2003 12:34:07 +0000 (12:34 +0000)
to 'int'.

lib/ChangeLog
lib/stdbool_.h

index 40aa9facc91b9217e048d95a73405f9bc8c41174..e08573f9fef6f536f8d7e40272aef3e649df5d67 100644 (file)
@@ -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).
index 52d224bfde06b3f6c5b8b5795a3a2d3fb1297841..3dbb51b24b68b20621d7a6bb61d17cc75d3f9082 100644 (file)
 
 /* 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
    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;