>From 16a1b6af1e618b22d621edc6054d4225cbcb98a1 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 18 Sep 2022 18:47:22 +0200 Subject: [PATCH 2/2] stdbool: Ensure that 'true' can be used in the preprocessor. * m4/c-bool.m4 (gl_C_BOOL): With Sun C++, redefine 'true' if it does not evaluate to 1 in the preprocessor. --- ChangeLog | 4 ++++ m4/c-bool.m4 | 20 +++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3ea944f7d2..87c370bd04 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2022-09-18 Bruno Haible + stdbool: Ensure that 'true' can be used in the preprocessor. + * m4/c-bool.m4 (gl_C_BOOL): With Sun C++, redefine 'true' if it does not + evaluate to 1 in the preprocessor. + stdbool-c99: Ensure that 'true' can be used in the preprocessor. * lib/stdbool.in.h (true): Redefine if it does not evaluate to 1 in the preprocessor. diff --git a/m4/c-bool.m4 b/m4/c-bool.m4 index db96ad1057..980de611b9 100644 --- a/m4/c-bool.m4 +++ b/m4/c-bool.m4 @@ -23,11 +23,21 @@ AC_DEFUN([gl_C_BOOL], fi dnl The "zz" puts this toward config.h's end, to avoid potential - dnl collisions with other definitions. Check - dnl __bool_true_false_are_defined to avoid re-including . + dnl collisions with other definitions. + dnl In C++ mode 'bool', 'true', 'false' are keywords and thus we don't need + dnl . But in C mode, we do. + dnl Check __bool_true_false_are_defined to avoid re-including . + dnl In Sun C++ 5.11 (Solaris Studio 12.2) and older, 'true' as a preprocessor + dnl expression evaluates to 0, not 1. Fix this by overriding 'true'. Note + dnl that the replacement has to be of type 'bool'. AH_VERBATIM([zzbool], -[#if (!defined HAVE_C_BOOL && !defined __cplusplus \ - && !defined __bool_true_false_are_defined) - #include +[#if !defined HAVE_C_BOOL +# if !defined __cplusplus && !defined __bool_true_false_are_defined +# include +# endif +# if defined __SUNPRO_CC && true != 1 +# undef true +# define true (!false) +# endif #endif]) ]) -- 2.34.1