bug-gnulib
[Top][All Lists]
Advanced

[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;





reply via email to

[Prev in Thread] Current Thread [Next in Thread]