ea0b06415b
...by backporting upstream <https://git.postgresql.org/gitweb/?p=postgresql.git;a=commitdiff;h=bc5a4dfcf7390145dc3ba3c1c18c5ce561b778cd> "Assume that <stdbool.h> conforms to the C standard." to our REL_14_15 version. GCC 15 trunk defaults to C23 now, so started to fail with > In file included from fls.c:49: > ../../src/include/c.h:419:23: error: two or more data types in declaration specifiers > 419 | typedef unsigned char bool; > | ^~~~ > ../../src/include/c.h:419:1: warning: useless type name in empty declaration > 419 | typedef unsigned char bool; > | ^~~~~~~ > make: *** [<builtin>: fls.o] Error 1 > make: Leaving directory 'workdir/UnpackedTarball/postgresql/src/port' (Removing HAVE__BOOL and HAVE_STDBOOL_H also from src/tools/msvc/Solution.pm is necessary to avoid failures like > "C:/cygwin64/home/tdf/jenkins/workspace/gerrit_windows/workdir/UnpackedTarball/openssl\apps\openssl.exe" version 2>&1unused defines: HAVE_STDBOOL_H HAVE__BOOL at /home/tdf/jenkins/workspace/gerrit_windows/workdir/UnpackedTarball/postgresql/src/tools/msvc/Mkvcbuild.pm line 870. > make[1]: *** [C:/cygwin64/home/tdf/jenkins/workspace/gerrit_windows/external/postgresql/ExternalProject_postgresql.mk:27: C:/cygwin64/home/tdf/jenkins/workspace/gerrit_windows/workdir/ExternalProject/postgresql/build] Error 1 in MSVC builds.) Change-Id: I1f6bd0d613ae4d6ce70feaaf67aaf95496eeff87 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/177280 Reviewed-by: Michael Stahl <michael.stahl@allotropia.de> Tested-by: Jenkins
429 lines
14 KiB
Groff
429 lines
14 KiB
Groff
From d5fb5a35816df670d329600e44fe22617b578415 Mon Sep 17 00:00:00 2001
|
|
From: Thomas Munro <tmunro@postgresql.org>
|
|
Date: Mon, 25 Nov 2024 13:11:28 +1300
|
|
Subject: Assume that <stdbool.h> conforms to the C standard.
|
|
|
|
Previously we checked "for <stdbool.h> that conforms to C99" using
|
|
autoconf's AC_HEADER_STDBOOL macro. We've required C99 since PostgreSQL
|
|
12, so the test was redundant, and under C23 it was broken: autoconf
|
|
2.69's implementation doesn't understand C23's new empty header (the
|
|
macros it's looking for went away, replaced by language keywords).
|
|
Later autoconf versions fixed that, but let's just remove the
|
|
anachronistic test.
|
|
|
|
HAVE_STDBOOL_H and HAVE__BOOL will no longer be defined, but they
|
|
weren't directly tested in core or likely extensions (except in 11, see
|
|
below). PG_USE_STDBOOL (or USE_STDBOOL in 11 and 12) is still defined
|
|
when sizeof(bool) is 1, which should be true on all modern systems.
|
|
Otherwise we define our own bool type and values of size 1, which would
|
|
fail to compile under C23 as revealed by the broken test. (We'll
|
|
probably clean that dead code up in master, but here we want a minimal
|
|
back-patchable change.)
|
|
|
|
This came to our attention when GCC 15 recently started using using C23
|
|
by default and failed to compile the replacement code, as reported by
|
|
Sam James and build farm animal alligator.
|
|
|
|
Back-patch to all supported releases, and then two older versions that
|
|
also know about <stdbool.h>, per the recently-out-of-support policy[1].
|
|
12 requires C99 so it's much like the supported releases, but 11 only
|
|
assumes C89 so it now uses AC_CHECK_HEADERS instead of the overly picky
|
|
AC_HEADER_STDBOOL. (I could find no discussion of which historical
|
|
systems had <stdbool.h> but failed the conformance test; if they ever
|
|
existed, they surely aren't relevant to that policy's goals.)
|
|
|
|
[1] https://wiki.postgresql.org/wiki/Committing_checklist#Policies
|
|
|
|
Reported-by: Sam James <sam@gentoo.org>
|
|
Reviewed-by: Peter Eisentraut <peter@eisentraut.org> (master version)
|
|
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> (approach)
|
|
Discussion: https://www.postgresql.org/message-id/flat/87o72eo9iu.fsf%40gentoo.org
|
|
(cherry picked from commit bc5a4dfcf7390145dc3ba3c1c18c5ce561b778cd)
|
|
Conflicts:
|
|
configure
|
|
meson.build
|
|
src/include/pg_config.h.in
|
|
src/tools/msvc/Solution.pm
|
|
---
|
|
configure | 182 +++++++++----------------------------
|
|
configure.ac | 13 +--
|
|
src/include/c.h | 2 +-
|
|
src/include/pg_config.h.in | 6 --
|
|
src/tools/msvc/Solution.pm | 2 -
|
|
5 files changed, 48 insertions(+), 157 deletions(-)
|
|
|
|
diff --git a/configure b/configure
|
|
index 7e6030e9e1..7a5bdeddbd 100755
|
|
--- a/configure
|
|
+++ b/configure
|
|
@@ -2085,116 +2085,116 @@ $as_echo "$ac_res" >&6; }
|
|
|
|
} # ac_fn_c_check_func
|
|
|
|
-# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
|
|
-# -------------------------------------------
|
|
-# Tests whether TYPE exists after having included INCLUDES, setting cache
|
|
-# variable VAR accordingly.
|
|
-ac_fn_c_check_type ()
|
|
+# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
|
|
+# ----------------------------------------------------
|
|
+# Tries to find if the field MEMBER exists in type AGGR, after including
|
|
+# INCLUDES, setting cache variable VAR accordingly.
|
|
+ac_fn_c_check_member ()
|
|
{
|
|
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
|
-$as_echo_n "checking for $2... " >&6; }
|
|
-if eval \${$3+:} false; then :
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
|
|
+$as_echo_n "checking for $2.$3... " >&6; }
|
|
+if eval \${$4+:} false; then :
|
|
$as_echo_n "(cached) " >&6
|
|
else
|
|
- eval "$3=no"
|
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
/* end confdefs.h. */
|
|
-$4
|
|
+$5
|
|
int
|
|
main ()
|
|
{
|
|
-if (sizeof ($2))
|
|
- return 0;
|
|
+static $2 ac_aggr;
|
|
+if (ac_aggr.$3)
|
|
+return 0;
|
|
;
|
|
return 0;
|
|
}
|
|
_ACEOF
|
|
if ac_fn_c_try_compile "$LINENO"; then :
|
|
+ eval "$4=yes"
|
|
+else
|
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
/* end confdefs.h. */
|
|
-$4
|
|
+$5
|
|
int
|
|
main ()
|
|
{
|
|
-if (sizeof (($2)))
|
|
- return 0;
|
|
+static $2 ac_aggr;
|
|
+if (sizeof ac_aggr.$3)
|
|
+return 0;
|
|
;
|
|
return 0;
|
|
}
|
|
_ACEOF
|
|
if ac_fn_c_try_compile "$LINENO"; then :
|
|
-
|
|
+ eval "$4=yes"
|
|
else
|
|
- eval "$3=yes"
|
|
+ eval "$4=no"
|
|
fi
|
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
fi
|
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
fi
|
|
-eval ac_res=\$$3
|
|
+eval ac_res=\$$4
|
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
|
$as_echo "$ac_res" >&6; }
|
|
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
|
|
|
-} # ac_fn_c_check_type
|
|
+} # ac_fn_c_check_member
|
|
|
|
-# ac_fn_c_check_member LINENO AGGR MEMBER VAR INCLUDES
|
|
-# ----------------------------------------------------
|
|
-# Tries to find if the field MEMBER exists in type AGGR, after including
|
|
-# INCLUDES, setting cache variable VAR accordingly.
|
|
-ac_fn_c_check_member ()
|
|
+# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
|
|
+# -------------------------------------------
|
|
+# Tests whether TYPE exists after having included INCLUDES, setting cache
|
|
+# variable VAR accordingly.
|
|
+ac_fn_c_check_type ()
|
|
{
|
|
as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
|
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
|
|
-$as_echo_n "checking for $2.$3... " >&6; }
|
|
-if eval \${$4+:} false; then :
|
|
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
|
|
+$as_echo_n "checking for $2... " >&6; }
|
|
+if eval \${$3+:} false; then :
|
|
$as_echo_n "(cached) " >&6
|
|
else
|
|
+ eval "$3=no"
|
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
/* end confdefs.h. */
|
|
-$5
|
|
+$4
|
|
int
|
|
main ()
|
|
{
|
|
-static $2 ac_aggr;
|
|
-if (ac_aggr.$3)
|
|
-return 0;
|
|
+if (sizeof ($2))
|
|
+ return 0;
|
|
;
|
|
return 0;
|
|
}
|
|
_ACEOF
|
|
if ac_fn_c_try_compile "$LINENO"; then :
|
|
- eval "$4=yes"
|
|
-else
|
|
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
/* end confdefs.h. */
|
|
-$5
|
|
+$4
|
|
int
|
|
main ()
|
|
{
|
|
-static $2 ac_aggr;
|
|
-if (sizeof ac_aggr.$3)
|
|
-return 0;
|
|
+if (sizeof (($2)))
|
|
+ return 0;
|
|
;
|
|
return 0;
|
|
}
|
|
_ACEOF
|
|
if ac_fn_c_try_compile "$LINENO"; then :
|
|
- eval "$4=yes"
|
|
+
|
|
else
|
|
- eval "$4=no"
|
|
+ eval "$3=yes"
|
|
fi
|
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
fi
|
|
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
fi
|
|
-eval ac_res=\$$4
|
|
+eval ac_res=\$$3
|
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
|
|
$as_echo "$ac_res" >&6; }
|
|
eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
|
|
|
|
-} # ac_fn_c_check_member
|
|
+} # ac_fn_c_check_type
|
|
|
|
# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
|
|
# --------------------------------------------
|
|
@@ -13746,100 +13746,6 @@ fi
|
|
## Header files
|
|
##
|
|
|
|
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5
|
|
-$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; }
|
|
-if ${ac_cv_header_stdbool_h+:} false; then :
|
|
- $as_echo_n "(cached) " >&6
|
|
-else
|
|
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
|
|
-/* end confdefs.h. */
|
|
-
|
|
- #include <stdbool.h>
|
|
- #ifndef bool
|
|
- "error: bool is not defined"
|
|
- #endif
|
|
- #ifndef false
|
|
- "error: false is not defined"
|
|
- #endif
|
|
- #if false
|
|
- "error: false is not 0"
|
|
- #endif
|
|
- #ifndef true
|
|
- "error: true is not defined"
|
|
- #endif
|
|
- #if true != 1
|
|
- "error: true is not 1"
|
|
- #endif
|
|
- #ifndef __bool_true_false_are_defined
|
|
- "error: __bool_true_false_are_defined is not defined"
|
|
- #endif
|
|
-
|
|
- struct s { _Bool s: 1; _Bool t; } s;
|
|
-
|
|
- char a[true == 1 ? 1 : -1];
|
|
- char b[false == 0 ? 1 : -1];
|
|
- char c[__bool_true_false_are_defined == 1 ? 1 : -1];
|
|
- char d[(bool) 0.5 == true ? 1 : -1];
|
|
- /* See body of main program for 'e'. */
|
|
- char f[(_Bool) 0.0 == false ? 1 : -1];
|
|
- char g[true];
|
|
- char h[sizeof (_Bool)];
|
|
- char i[sizeof s.t];
|
|
- enum { j = false, k = true, l = false * true, m = true * 256 };
|
|
- /* The following fails for
|
|
- HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */
|
|
- _Bool n[m];
|
|
- char o[sizeof n == m * sizeof n[0] ? 1 : -1];
|
|
- char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1];
|
|
- /* Catch a bug in an HP-UX C compiler. See
|
|
- http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html
|
|
- http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html
|
|
- */
|
|
- _Bool q = true;
|
|
- _Bool *pq = &q;
|
|
-
|
|
-int
|
|
-main ()
|
|
-{
|
|
-
|
|
- bool e = &s;
|
|
- *pq |= q;
|
|
- *pq |= ! q;
|
|
- /* Refer to every declared value, to avoid compiler optimizations. */
|
|
- return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l
|
|
- + !m + !n + !o + !p + !q + !pq);
|
|
-
|
|
- ;
|
|
- return 0;
|
|
-}
|
|
-_ACEOF
|
|
-if ac_fn_c_try_compile "$LINENO"; then :
|
|
- ac_cv_header_stdbool_h=yes
|
|
-else
|
|
- ac_cv_header_stdbool_h=no
|
|
-fi
|
|
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
|
|
-fi
|
|
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5
|
|
-$as_echo "$ac_cv_header_stdbool_h" >&6; }
|
|
- ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default"
|
|
-if test "x$ac_cv_type__Bool" = xyes; then :
|
|
-
|
|
-cat >>confdefs.h <<_ACEOF
|
|
-#define HAVE__BOOL 1
|
|
-_ACEOF
|
|
-
|
|
-
|
|
-fi
|
|
-
|
|
-
|
|
-if test $ac_cv_header_stdbool_h = yes; then
|
|
-
|
|
-$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h
|
|
-
|
|
-fi
|
|
-
|
|
-
|
|
for ac_header in atomic.h copyfile.h execinfo.h getopt.h ifaddrs.h langinfo.h mbarrier.h poll.h sys/epoll.h sys/event.h sys/ipc.h sys/personality.h sys/prctl.h sys/procctl.h sys/pstat.h sys/resource.h sys/select.h sys/sem.h sys/shm.h sys/signalfd.h sys/sockio.h sys/tas.h sys/uio.h sys/un.h termios.h ucred.h wctype.h
|
|
do :
|
|
as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
|
|
@@ -15711,9 +15617,7 @@ $as_echo_n "checking size of bool... " >&6; }
|
|
if ${ac_cv_sizeof_bool+:} false; then :
|
|
$as_echo_n "(cached) " >&6
|
|
else
|
|
- if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (bool))" "ac_cv_sizeof_bool" "#ifdef HAVE_STDBOOL_H
|
|
-#include <stdbool.h>
|
|
-#endif
|
|
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (bool))" "ac_cv_sizeof_bool" "#include <stdbool.h>
|
|
"; then :
|
|
|
|
else
|
|
@@ -15739,7 +15643,7 @@ _ACEOF
|
|
|
|
|
|
|
|
-if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then
|
|
+if test "$ac_cv_sizeof_bool" = 1; then
|
|
|
|
$as_echo "#define PG_USE_STDBOOL 1" >>confdefs.h
|
|
|
|
diff --git a/configure.ac b/configure.ac
|
|
index 7a75d6e37c..5484c910f6 100644
|
|
--- a/configure.ac
|
|
+++ b/configure.ac
|
|
@@ -1418,8 +1418,6 @@ AC_SUBST(UUID_LIBS)
|
|
## Header files
|
|
##
|
|
|
|
-AC_HEADER_STDBOOL
|
|
-
|
|
AC_CHECK_HEADERS(m4_normalize([
|
|
atomic.h
|
|
copyfile.h
|
|
@@ -1734,14 +1732,11 @@ if test "$ac_cv_sizeof_off_t" -lt 8 -a "$segsize" != "1"; then
|
|
AC_MSG_ERROR([Large file support is not enabled. Segment size cannot be larger than 1GB.])
|
|
fi
|
|
|
|
-AC_CHECK_SIZEOF([bool], [],
|
|
-[#ifdef HAVE_STDBOOL_H
|
|
-#include <stdbool.h>
|
|
-#endif])
|
|
+AC_CHECK_SIZEOF([bool], [], [#include <stdbool.h>])
|
|
|
|
-dnl We use <stdbool.h> if we have it and it declares type bool as having
|
|
-dnl size 1. Otherwise, c.h will fall back to declaring bool as unsigned char.
|
|
-if test "$ac_cv_header_stdbool_h" = yes -a "$ac_cv_sizeof_bool" = 1; then
|
|
+dnl We use <stdbool.h> if bool has size 1 after including it. Otherwise, c.h
|
|
+dnl will fall back to declaring bool as unsigned char.
|
|
+if test "$ac_cv_sizeof_bool" = 1; then
|
|
AC_DEFINE([PG_USE_STDBOOL], 1,
|
|
[Define to 1 to use <stdbool.h> to define type bool.])
|
|
fi
|
|
diff --git a/src/include/c.h b/src/include/c.h
|
|
index dd2e3b0f3e..cc19c23fb6 100644
|
|
--- a/src/include/c.h
|
|
+++ b/src/include/c.h
|
|
@@ -398,7 +398,7 @@ typedef void (*pg_funcptr_t) (void);
|
|
* bool
|
|
* Boolean value, either true or false.
|
|
*
|
|
- * We use stdbool.h if available and its bool has size 1. That's useful for
|
|
+ * We use stdbool.h if bool has size 1 after including it. That's useful for
|
|
* better compiler and debugger output and for compatibility with third-party
|
|
* libraries. But PostgreSQL currently cannot deal with bool of other sizes;
|
|
* there are static assertions around the code to prevent that.
|
|
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in
|
|
index 99e3731813..d9ef9a41bf 100644
|
|
--- a/src/include/pg_config.h.in
|
|
+++ b/src/include/pg_config.h.in
|
|
@@ -517,9 +517,6 @@
|
|
/* Define to 1 if you have the `SSL_CTX_set_num_tickets' function. */
|
|
#undef HAVE_SSL_CTX_SET_NUM_TICKETS
|
|
|
|
-/* Define to 1 if stdbool.h conforms to C99. */
|
|
-#undef HAVE_STDBOOL_H
|
|
-
|
|
/* Define to 1 if you have the <stdint.h> header file. */
|
|
#undef HAVE_STDINT_H
|
|
|
|
@@ -730,9 +727,6 @@
|
|
/* Define to 1 if the assembler supports X86_64's POPCNTQ instruction. */
|
|
#undef HAVE_X86_64_POPCNTQ
|
|
|
|
-/* Define to 1 if the system has the type `_Bool'. */
|
|
-#undef HAVE__BOOL
|
|
-
|
|
/* Define to 1 if your compiler understands __builtin_bswap16. */
|
|
#undef HAVE__BUILTIN_BSWAP16
|
|
|
|
diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm
|
|
index 07cc7b7ba2..f0ce2ac804 100644
|
|
--- a/src/tools/msvc/Solution.pm
|
|
+++ b/src/tools/msvc/Solution.pm
|
|
@@ -365,7 +365,6 @@ sub GenerateFiles
|
|
HAVE_SPINLOCKS => 1,
|
|
HAVE_SSL_CTX_SET_NUM_TICKETS => undef,
|
|
HAVE_SRANDOM => undef,
|
|
- HAVE_STDBOOL_H => 1,
|
|
HAVE_STDINT_H => 1,
|
|
HAVE_STDLIB_H => 1,
|
|
HAVE_STRCHRNUL => undef,
|
|
@@ -436,7 +435,6 @@ sub GenerateFiles
|
|
HAVE_X509_GET_SIGNATURE_NID => 1,
|
|
HAVE_X509_GET_SIGNATURE_INFO => undef,
|
|
HAVE_X86_64_POPCNTQ => undef,
|
|
- HAVE__BOOL => undef,
|
|
HAVE__BUILTIN_BSWAP16 => undef,
|
|
HAVE__BUILTIN_BSWAP32 => undef,
|
|
HAVE__BUILTIN_BSWAP64 => undef,
|
|
--
|
|
2.47.0
|
|
|