]> git.eshelyaron.com Git - emacs.git/commitdiff
Port better to C23 bool+true+false keywords
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 28 Sep 2022 08:06:10 +0000 (01:06 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 28 Sep 2022 08:09:01 +0000 (01:09 -0700)
C23 is adding the C++ keywords bool, true, and false;
prefer them to <stdbool.h> if they are available.
* admin/merge-gnulib (GNULIB_MODULES):
Add stdbool, which emulates C23 on pre-C23 platforms.
(AVOIDED_MODULES): Remove stdbool; Gnulib has renamed
this module to stdbool-c99 and nobody uses it so it does
not need to be avoided.
* m4/c-bool.m4: New file, from Gnulib stdbool module.
* lib-src/seccomp-filter.c, src/conf_post.h, src/dynlib.h:
* src/emacs-module.c, src/nsterm.m, src/systhread.h:
* test/src/emacs-module-resources/mod-test.c:
Use the C23 style and use bool without including <stdbool.h>.
The Gnulib stdbool module causes config.h to include stdbool.h
on pre-C23 platforms.
* src/emacs-module.h.in:
Don’t include <stdbool.h> if C23 or later, or if
it has already been included.

13 files changed:
admin/merge-gnulib
doc/lispref/internals.texi
lib-src/seccomp-filter.c
lib/gnulib.mk.in
m4/c-bool.m4 [new file with mode: 0644]
m4/gnulib-comp.m4
src/conf_post.h
src/dynlib.h
src/emacs-module.c
src/emacs-module.h.in
src/nsterm.m
src/systhread.h
test/src/emacs-module-resources/mod-test.c

index 4dd6a4d222faa6a937ebb285de79ef7c78e1b02d..d3c5520ad0fcc4084bbc7898799ebc2fdbde57b7 100755 (executable)
@@ -43,7 +43,7 @@ GNULIB_MODULES='
   nanosleep nproc nstrftime
   pathmax pipe2 pselect pthread_sigmask
   qcopy-acl readlink readlinkat regex
-  sig2str sigdescr_np socklen stat-time std-gnu11 stdalign stddef stdio
+  sig2str sigdescr_np socklen stat-time std-gnu11 stdalign stdbool stddef stdio
   stpcpy strnlen strtoimax symlink sys_stat sys_time
   tempname time time_r time_rz timegm timer-time timespec-add timespec-sub
   update-copyright unlocked-io utimensat
@@ -54,7 +54,7 @@ AVOIDED_MODULES='
   btowc chmod close crypto/af_alg dup fchdir fstat langinfo lock
   mbrtowc mbsinit memchr mkdir msvc-inval msvc-nothrow nl_langinfo
   openat-die opendir pthread-h raise
-  save-cwd select setenv sigprocmask stat stdarg stdbool
+  save-cwd select setenv sigprocmask stat stdarg
   threadlib tzset unsetenv utime utime-h
   wchar wcrtomb wctype-h
 '
index 8d2089bad8bbaf1183672a619ee4bd9a9a2bb038..ea1679f6934cc5e858d328d5193c9d6fb368dfc3 100644 (file)
@@ -3004,8 +3004,8 @@ Using @code{bool} can make programs easier to read and a bit faster than
 using @code{int}.  Although it is also OK to use @code{int}, @code{0}
 and @code{1}, this older style is gradually being phased out.  When
 using @code{bool}, respect the limitations of the replacement
-implementation of @code{bool}, as documented in the source file
-@file{lib/stdbool.in.h}.  In particular, boolean bitfields should be of type
+implementation of @code{bool}.  In particular,
+boolean bitfields should be of type
 @code{bool_bf}, not @code{bool}, so that they work correctly even when
 compiling Objective C with standard GCC.
 
index 9f0de7d64f83e432607aa1701478a919606ed02f..4bd2816dfc5e650efbd56a74d47d57ea857078df 100644 (file)
@@ -39,7 +39,6 @@ variants of those files that can be used to sandbox Emacs before
 #include <errno.h>
 #include <limits.h>
 #include <stdarg.h>
-#include <stdbool.h>
 #include <stdlib.h>
 #include <stdint.h>
 #include <stdio.h>
index 7eca66a60932281b86ac8cc07886fc8afec08386..04644bdabe334e050fed4e65d73400ee7153c8eb 100644 (file)
@@ -60,7 +60,6 @@
 #  --avoid=sigprocmask \
 #  --avoid=stat \
 #  --avoid=stdarg \
-#  --avoid=stdbool \
 #  --avoid=threadlib \
 #  --avoid=tzset \
 #  --avoid=unsetenv \
 #  stat-time \
 #  std-gnu11 \
 #  stdalign \
+#  stdbool \
 #  stddef \
 #  stdio \
 #  stpcpy \
@@ -953,6 +953,8 @@ MKDIR_P = @MKDIR_P@
 MODULES_OBJ = @MODULES_OBJ@
 MODULES_SECONDARY_SUFFIX = @MODULES_SECONDARY_SUFFIX@
 MODULES_SUFFIX = @MODULES_SUFFIX@
+NEXT_ASSERT_H = @NEXT_ASSERT_H@
+NEXT_AS_FIRST_DIRECTIVE_ASSERT_H = @NEXT_AS_FIRST_DIRECTIVE_ASSERT_H@
 NEXT_AS_FIRST_DIRECTIVE_DIRENT_H = @NEXT_AS_FIRST_DIRECTIVE_DIRENT_H@
 NEXT_AS_FIRST_DIRECTIVE_ERRNO_H = @NEXT_AS_FIRST_DIRECTIVE_ERRNO_H@
 NEXT_AS_FIRST_DIRECTIVE_FCNTL_H = @NEXT_AS_FIRST_DIRECTIVE_FCNTL_H@
diff --git a/m4/c-bool.m4 b/m4/c-bool.m4
new file mode 100644 (file)
index 0000000..bb109b7
--- /dev/null
@@ -0,0 +1,51 @@
+# Check for bool that conforms to C2023.
+
+dnl Copyright 2022 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_C_BOOL],
+[
+  AC_CACHE_CHECK([for bool, true, false], [gl_cv_c_bool],
+    [AC_COMPILE_IFELSE(
+       [AC_LANG_SOURCE([[
+          #if true == false
+           #error "true == false"
+          #endif
+          extern bool b;
+          bool b = true == false;]])],
+       [gl_cv_c_bool=yes],
+       [gl_cv_c_bool=no])])
+  if test "$gl_cv_c_bool" = yes; then
+    AC_DEFINE([HAVE_C_BOOL], [1],
+      [Define to 1 if bool, true and false work as per C2023.])
+  fi
+
+  AC_CHECK_HEADERS_ONCE([stdbool.h])
+
+  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.
+  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],
+[#ifndef HAVE_C_BOOL
+# if !defined __cplusplus && !defined __bool_true_false_are_defined
+#  if HAVE_STDBOOL_H
+#   include <stdbool.h>
+#  else
+#   if defined __SUNPRO_C
+#    error "<stdbool.h> is not usable with this configuration. To make it usable, add -D_STDC_C99= to $CC."
+#   else
+#    error "<stdbool.h> does not exist on this platform. Use gnulib module 'stdbool-c99' instead of gnulib module 'stdbool'."
+#   endif
+#  endif
+# endif
+# if !true
+#  define true (!false)
+# endif
+#endif])
+])
index 6a5f3006781e8de59d50c1f1aaf07a44131477f3..f1ac49913241262f6243ecac43cb0db87880929a 100644 (file)
@@ -172,6 +172,7 @@ AC_DEFUN([gl_EARLY],
   # Code from module stat-time:
   # Code from module std-gnu11:
   # Code from module stdalign:
+  # Code from module stdbool:
   # Code from module stdckdint:
   # Code from module stddef:
   # Code from module stdint:
@@ -490,6 +491,7 @@ AC_DEFUN([gl_INIT],
   gl_STDALIGN_H
   gl_CONDITIONAL_HEADER([stdalign.h])
   AC_PROG_MKDIR_P
+  gl_C_BOOL
   gl_STDDEF_H
   gl_STDDEF_H_REQUIRE_DEFAULTS
   gl_CONDITIONAL_HEADER([stddef.h])
@@ -1428,6 +1430,7 @@ AC_DEFUN([gl_FILE_LIST], [
   m4/assert_h.m4
   m4/builtin-expect.m4
   m4/byteswap.m4
+  m4/c-bool.m4
   m4/canonicalize.m4
   m4/clock_time.m4
   m4/copy-file-range.m4
index 6ecebf36ab9627b8a3fc060bd14026599f78f656..fb8d2e5d96ef3d9025dcfbd689df48c0b74ac514 100644 (file)
@@ -30,14 +30,10 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #endif
 
 /* To help make dependencies clearer elsewhere, this file typically
-   does not #include other files.  The exceptions are stdbool.h
-   because it is unlikely to interfere with configuration and bool is
-   such a core part of the C language, and ms-w32.h (DOS_NT
+   does not #include other files.  The exception is ms-w32.h (DOS_NT
    only) because it historically was included here and changing that
    would take some work.  */
 
-#include <stdbool.h>
-
 #if defined WINDOWSNT && !defined DEFER_MS_W32_H
 # include <ms-w32.h>
 #endif
index 03b8f983564fe43c00defc1695027fd72f1b3709..9a11c12898175bf22eb99ac34cc424b73bb76aa8 100644 (file)
@@ -21,7 +21,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #define DYNLIB_H
 
 #include <attribute.h>
-#include <stdbool.h>
 
 typedef void *dynlib_handle_ptr;
 dynlib_handle_ptr dynlib_open (const char *path);
index 1c392d65df8aa250405265ef1d4b3ac0d747a4ae..fcdf103c19b6495f7d83f55a5b5d81444061d1e4 100644 (file)
@@ -78,7 +78,6 @@ To add a new module function, proceed as follows:
 #include "emacs-module.h"
 
 #include <stdarg.h>
-#include <stdbool.h>
 #include <stddef.h>
 #include <stdint.h>
 #include <stdlib.h>
index 6642b55d9328ec98d92b2e0de5ab016e15cb726b..bef89b059fc8751367cf0bb72faaa7e227891266 100644 (file)
@@ -30,7 +30,8 @@ information how to write modules and use this header file.
 #include <stdint.h>
 #include <time.h>
 
-#ifndef __cplusplus
+#if ((defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 202311 \
+     && !defined __bool_true_false_are_defined && !defined __cplusplus)
 #include <stdbool.h>
 #endif
 
index 44979c7c04e5225766c4324fa3e35701c0804522..b68a6f8ec122655b38601ff9d44d373f9aed2948 100644 (file)
@@ -37,7 +37,6 @@ GNUstep port and post-20 update by Adrian Robert (arobert@cogsci.ucsd.edu)
 #include <time.h>
 #include <signal.h>
 #include <unistd.h>
-#include <stdbool.h>
 
 #include <c-ctype.h>
 #include <c-strcase.h>
index bf4e0306cdca2927cc2c5071f42f866c0489c490..10d6237f275724555465d21844e274cfaa5031c6 100644 (file)
@@ -19,8 +19,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #ifndef SYSTHREAD_H
 #define SYSTHREAD_H
 
-#include <stdbool.h>
-
 #include <attribute.h>
 
 #ifdef THREADS_ENABLED
index 187af821c22ecc2febeba7f5957f5d246a91ac58..b47a0b7a39b5c8d1b7db60d92821b92acb960f73 100644 (file)
@@ -24,7 +24,6 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 
 #include <errno.h>
 #include <limits.h>
-#include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>