From 2eb78f0716542854209a35d7ea5bd2d38ef32582 Mon Sep 17 00:00:00 2001
From: Bruno Haible <bruno@clisp.org>
Date: Sat, 24 Sep 2022 23:42:44 +0200
Subject: [PATCH] stdbool: Don't #include a gnulib-generated stdbool.h from
 config.h.

* m4/c-bool.m4 (gl_C_BOOL): Check for stdbool.h and for _Bool. If
stdbool.h does not exist, don't #include <stdbool.h> but instead put the
substitute code into config.h.
---
 ChangeLog       |  7 +++++++
 m4/c-bool.m4    | 42 +++++++++++++++++++++++++++++++++++++++++-
 modules/stdbool |  1 +
 3 files changed, 49 insertions(+), 1 deletion(-)

diff --git a/ChangeLog b/ChangeLog
index 76287c5022..1c54eabb49 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2022-09-24  Bruno Haible  <bruno@clisp.org>
+
+	stdbool: Don't #include a gnulib-generated stdbool.h from config.h.
+	* m4/c-bool.m4 (gl_C_BOOL): Check for stdbool.h and for _Bool. If
+	stdbool.h does not exist, don't #include <stdbool.h> but instead put the
+	substitute code into config.h.
+
 2022-09-24  Bruno Haible  <bruno@clisp.org>
 
 	stdalign: Don't #include a gnulib-generated stdalign.h from config.h.
diff --git a/m4/c-bool.m4 b/m4/c-bool.m4
index 67c2cf2621..129981d2f7 100644
--- a/m4/c-bool.m4
+++ b/m4/c-bool.m4
@@ -22,6 +22,10 @@ AC_DEFUN([gl_C_BOOL],
       [Define to 1 if bool, true and false work as per C2023.])
   fi
 
+  AC_CHECK_HEADERS_ONCE([stdbool.h])
+  AC_REQUIRE([AC_CHECK_HEADER_STDBOOL])
+  AC_DEFINE_UNQUOTED([HAVE__BOOL],[$HAVE__BOOL])
+
   dnl The "zz" puts this toward config.h's end, to avoid potential
   dnl collisions with other definitions.
   dnl If 'bool', 'true' and 'false' do not work, arrange for them to work.
@@ -32,7 +36,43 @@ AC_DEFUN([gl_C_BOOL],
   AH_VERBATIM([zzbool],
 [#ifndef HAVE_C_BOOL
 # if !defined __cplusplus && !defined __bool_true_false_are_defined
-#  include <stdbool.h>
+#  if HAVE_STDBOOL_H
+#   include <stdbool.h>
+#  else
+    /* Substitute.  Keep consistent with gnulib/lib/stdbool.in.h.  */
+#   ifndef _GL_STDBOOL_H
+#    define _GL_STDBOOL_H
+#    ifdef __cplusplus
+#     if !defined _MSC_VER
+#      define _Bool bool
+#      define bool bool
+#     endif
+#    else
+#     if !defined __GNUC__
+#      define _Bool signed char
+#     else
+#      if !HAVE__BOOL
+typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool;
+#      endif
+#     endif
+#     define bool _Bool
+#    endif
+#    ifdef __cplusplus
+#     if !defined _MSC_VER
+#      define false false
+#      define true true
+#     endif
+#     if defined __SUNPRO_CC && true != 1
+#      undef true
+#      define true (!false)
+#     endif
+#    else
+#     define false 0
+#     define true 1
+#    endif
+#    define __bool_true_false_are_defined 1
+#   endif /* _GL_STDBOOL_H */
+#  endif
 # endif
 # if !true
 #  define true (!false)
diff --git a/modules/stdbool b/modules/stdbool
index 2e771a2336..664df5e0f8 100644
--- a/modules/stdbool
+++ b/modules/stdbool
@@ -3,6 +3,7 @@ A bool that is like C23.
 
 Files:
 m4/c-bool.m4
+m4/stdbool.m4
 
 Depends-on:
 c99
-- 
2.39.5