On 9/18/22 10:10, Bruno Haible wrote:
#define true (!false)
works! It evaluates to 1 and is of the right type.
Thanks, that's nicer than the tricky "#define true ((bool) +1)" that I
was going to suggest.
I did notice one glitch (an unnecessary "#undef true" that is always
commented out) and a couple of minor opportunities for simplification,
and installed the attached update.From 154986613fe8d25d086568426b394098a6f2f7aa Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@xxxxxxxxxxx>
Date: Sun, 18 Sep 2022 11:26:36 -0700
Subject: [PATCH] =?UTF-8?q?stdbool:=20omit=20=E2=80=98#undef=20true?=
=?UTF-8?q?=E2=80=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This is mostly just simplification.
* m4/c-bool.m4 (gl_C_BOOL): Test all preprocessors when
!HAVE_C_BOOL, not merely __SUNPRO_CC. Use the slightly
more-elegant ‘!true’ instead of ‘true == 1’; this shouldn’t matter
in practice and if it does matter we want to know about it anyway.
Remove an unnecessary ‘#undef true’ that is simply commented out
by ‘configure’; again, if true is already #defined to be 0 the
system is so messed up we want to know about it anyway.
---
ChangeLog | 12 ++++++++++++
m4/c-bool.m4 | 16 +++++++---------
2 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 87c370bd04..77862ed623 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2022-09-18 Paul Eggert <eggert@xxxxxxxxxxx>
+
+ stdbool: omit ‘#undef true’
+ This is mostly just simplification.
+ * m4/c-bool.m4 (gl_C_BOOL): Test all preprocessors when
+ !HAVE_C_BOOL, not merely __SUNPRO_CC. Use the slightly
+ more-elegant ‘!true’ instead of ‘true == 1’; this shouldn’t matter
+ in practice and if it does matter we want to know about it anyway.
+ Remove an unnecessary ‘#undef true’ that is simply commented out
+ by ‘configure’; again, if true is already #defined to be 0 the
+ system is so messed up we want to know about it anyway.
+
2022-09-18 Bruno Haible <bruno@xxxxxxxxx>
stdbool: Ensure that 'true' can be used in the preprocessor.
diff --git a/m4/c-bool.m4 b/m4/c-bool.m4
index 980de611b9..67c2cf2621 100644
--- a/m4/c-bool.m4
+++ b/m4/c-bool.m4
@@ -24,19 +24,17 @@ AC_DEFUN([gl_C_BOOL],
dnl The "zz" puts this toward config.h's end, to avoid potential
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'.
+ dnl If 'bool', 'true' and 'false' do not work, arrange for them to work.
+ dnl In C, this means including <stdbool.h> if it is not already included.
+ dnl However, if the preprocessor mistakenly treats 'true' as 0,
+ dnl define it to a bool expression equal to 1; this is needed in
+ dnl Sun C++ 5.11 (Oracle Solaris Studio 12.2, 2010) and older.
AH_VERBATIM([zzbool],
-[#if !defined HAVE_C_BOOL
+[#ifndef HAVE_C_BOOL
# if !defined __cplusplus && !defined __bool_true_false_are_defined
# include <stdbool.h>
# endif
-# if defined __SUNPRO_CC && true != 1
-# undef true
+# if !true
# define true (!false)
# endif
#endif])
--
2.37.3