On Wed, Aug 29, 2012 at 3:59 PM, Paul Eggert <egg...@cs.ucla.edu> wrote:

> I'm no C++ expert but this one looks like there's a straightforward
> fix: just use C++'s bool if available.  That's what GCC's stdbool.h does,
> anyway.  With other compilers this may be an issue of C and C++
> disagree with how _Bool is implemented but I suppose we can burn
> those bridges when we come to them.
>
> Here's the patch I installed into gnulib.
> Please give it a try, and further patches are welcome.
>
> From 067dea8fdc99b30a826c0c8aff8060fe4f8095bf Mon Sep 17 00:00:00 2001
> From: Paul Eggert <egg...@cs.ucla.edu>
> Date: Wed, 29 Aug 2012 07:52:32 -0700
> Subject: [PATCH] stdbool: be more compatible with mixed C/C++ compiles
>
> * lib/stdbool.in.h (_Bool, true, false) [__cplusplus]:
> Define to bool, true, false, respectively, as GCC's builtin
> stdbool.h does.  Problem reported by Michael Goffioul in
> <http://lists.gnu.org/archive/html/bug-gnulib/2012-08/msg00143.html>.
> ---
>  ChangeLog        |  8 ++++++++
>  lib/stdbool.in.h | 48 +++++++++++++++++++++++++++++-------------------
>  2 files changed, 37 insertions(+), 19 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index 63f651f..f484d28 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,11 @@
> +2012-08-29  Paul Eggert  <egg...@cs.ucla.edu>
> +
> +       stdbool: be more compatible with mixed C/C++ compiles
> +       * lib/stdbool.in.h (_Bool, true, false) [__cplusplus]:
> +       Define to bool, true, false, respectively, as GCC's builtin
> +       stdbool.h does.  Problem reported by Michael Goffioul in
> +       <
> http://lists.gnu.org/archive/html/bug-gnulib/2012-08/msg00143.html>.
> +
>  2012-08-28  Jim Meyering  <meyer...@redhat.com>
>
>         revert last change: it was not needed
> diff --git a/lib/stdbool.in.h b/lib/stdbool.in.h
> index e58f211..924c8ff 100644
> --- a/lib/stdbool.in.h
> +++ b/lib/stdbool.in.h
> @@ -66,24 +66,18 @@
>  # undef true
>  #endif
>
> -/* 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)).  So we add a negative value to the
> -   enum; this ensures that '_Bool' promotes to 'int'.  */
> -#if defined __cplusplus || (defined __BEOS__ && !defined __HAIKU__)
> +#ifdef __cplusplus
> +# define _Bool bool
> +#else
> +# if defined __BEOS__ && !defined __HAIKU__
>    /* 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@
> +#  if !@HAVE__BOOL@
>  typedef bool _Bool;
> -# endif
> -#else
> -# if !defined __GNUC__
> +#  endif
> +# else
> +#  if !defined __GNUC__
>     /* If @HAVE__BOOL@:
>          Some HP-UX cc and AIX IBM C compiler versions have compiler bugs
> when
>          the built-in _Bool type is used.  See
> @@ -103,19 +97,35 @@ typedef bool _Bool;
>            "Invalid enumerator. (badenum)" with HP-UX cc on Tru64.
>          The only benefit of the enum, debuggability, is not important
>          with these compilers.  So use 'signed char' and no enum.  */
> -#  define _Bool signed char
> -# else
> +#   define _Bool signed char
> +#  else
>     /* With this compiler, trust the _Bool type if the compiler has it.  */
> -#  if !@HAVE__BOOL@
> +#   if !@HAVE__BOOL@
> +   /* For the sake of symbolic names in gdb, 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 then
> +      values of type '_Bool' might 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 add a negative value to the
> +      enum; this ensures that '_Bool' promotes to 'int'.  */
>  typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 }
> _Bool;
> +#   endif
>  #  endif
>  # endif
>  #endif
>  #define bool _Bool
>
>  /* The other macros must be usable in preprocessor directives.  */
> -#define false 0
> -#define true 1
> +#ifdef __cplusplus
> +# define false false
> +# define true true
> +#else
> +# define false 0
> +# define true 1
> +#endif
> +
>  #define __bool_true_false_are_defined 1
>
>  #endif /* _GL_STDBOOL_H */
>

Thanks, that should indeed redefining true and false (I already tried that
solution with octave and it solved the problem). But why also include the
'#define bool _Bool' line in the patch and only do it in C? AFAIK "bool" is
a standard C++ type, there's no need to redefine it.

Michael.

Reply via email to