Fix testsuite failures on Darwin (aka macOS).

Tests of AC_{CHECK_,}HEADER_STDBOOL were failing on Darwin for two
reasons: an m4 quoting bug in tests/local.at causing Darwin sed to
throw syntax errors, and an excessively precise interpretation of how
C99 and C++11 interact.  The latter is worth mentioning in NEWS.

 * tests/local.at (_AT_DEFINES_CMP_PRUNE): Insert [] before ‘dnl’ in
   two places to keep it separate from the result of the m4_bpatsubsts
   operation that immediately precedes it.
 * lib/autoconf/headers.m4 (AC_CHECK_HEADER_STDBOOL): Allow ‘bool’,
   ‘true’, and ‘false’ not to be macros, after including stdbool.h,
   whenever __cplusplus is defined.
 * NEWS: Document change to AC_{CHECK_,}HEADER_STDBOOL.
This commit is contained in:
Zack Weinberg 2022-07-10 12:06:11 -04:00
parent db7205a864
commit 56b21590f6
No known key found for this signature in database
GPG Key ID: 384F8E68AC65B0D5
3 changed files with 19 additions and 4 deletions

13
NEWS
View File

@ -39,6 +39,19 @@ GNU Autoconf NEWS - User visible changes.
represent cache file timestamps, thus avoiding some problems where
automake incorrectly decides not to regenerate stale caches.
*** AC_HEADER_STDBOOL and AC_CHECK_HEADER_STDBOOL are less picky.
When compiling C++, a stdbool.h that exists, but does nothing, is
acceptable no matter what version of the C++ standard is in use.
(ISO C++ 2011 says that stdbool.h should exist for compatibility
with C, but should *not* define bool, true, or false as
macros. ISO C++ 1998 doesnt mention stdbool.h at all. Some C++
compilers implement the 2011 rule in their C++98 mode as well.
bool, true, and false have been built into the C++ language
since the beginning, so a stdbool.h that exists but does nothing
should be fine for all reasonable C++ programs.)
* Noteworthy changes in release 2.71 (2021-01-28) [stable]
** Bug fixes, including:

View File

@ -633,8 +633,10 @@ AC_DEFUN([AC_CHECK_HEADER_STDBOOL],
bool *pp = &p;
/* C 1999 specifies that bool, true, and false are to be
macros, but C++ 2011 and later overrule this. */
#if __cplusplus < 201103
macros, but C++ 2011 overrules this. The C++ committee
was codifying existing practice, so we allow them to
not be macros whenever __cplusplus is defined. */
#ifndef __cplusplus
#ifndef bool
#error "bool is not defined"
#endif

View File

@ -593,9 +593,9 @@ AT_CMP([at_defines-$1], [at_defines-$2])[]dnl
m4_define([_AT_DEFINES_CMP_PRUNE],
[m4_bmatch([$1],
[^vary:],
[ /@%:@define ]m4_bpatsubsts([$1], [\<vary:], [])dnl
[ /@%:@define ]m4_bpatsubsts([$1], [\<vary:], [])[]dnl
[@<:@ @{:@@:>@/ d ;@%:@@:}@
/@%:@undef ]m4_bpatsubsts([$1], [\<vary:], [])dnl
/@%:@undef ]m4_bpatsubsts([$1], [\<vary:], [])[]dnl
[@<:@ @{:@@:>@/ d ;@%:@@:}@
],
[m4_fatal([unrecognized AT_DEFINES_CMP variance token: "$1"])])])