2022-09-18 Bruno Haible <bruno@clisp.org>
+ 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.
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 <stdbool.h>.
+ dnl collisions with other definitions.
+ dnl In C++ mode 'bool', 'true', 'false' are keywords and thus we don't need
+ dnl <stdbool.h>. But in C mode, we do.
+ dnl Check __bool_true_false_are_defined to avoid re-including <stdbool.h>.
+ 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 <stdbool.h>
+[#if !defined HAVE_C_BOOL
+# if !defined __cplusplus && !defined __bool_true_false_are_defined
+# include <stdbool.h>
+# endif
+# if defined __SUNPRO_CC && true != 1
+# undef true
+# define true (!false)
+# endif
#endif])
])