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 <egg...@cs.ucla.edu>
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  <egg...@cs.ucla.edu>
+
+	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  <br...@clisp.org>
 
 	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

Reply via email to