On 2026-08-07 Paul Eggert wrote:
> On 8/7/26 10:57, Lasse Collin wrote:
> > I
> > don't know if this even needs to work because without
> > ac_cv_prog_cc_c23=no the compiler would be in GNU C11/C17 mode
>
> Yes. What happens if you remove the ac_cv_prog_cc_c11=no from
> configure.ac? (You can keep the ac_cv_prog_cxx_cxx11=no line.) Again,
> I'm looking for a simple fix.
Sorry, I meant to write _c11=no above, not _c23=no.
If the line ac_cv_prog_cc_c11=no is removed, then it works. That is,
after configuring with CC='clang -std=gnu99', Makefile has this:
CC = clang -std=gnu99 -std=gnu11
It works even with Autoconf 2.69 because Gnulib's std-gnu11.m4 adds the
check for -std=gnu11 which Autoconf 2.69 itself doesn't have.
* * *
I looked at the root cause. In the Gnulib-generated assert.h in both
gnu99 and gnu11 modes, these look correct:
_GL_HAVE__STATIC_ASSERT is defined.
_GL_HAVE__STATIC_ASSERT1 is not defined.
In gnu11 mode, Gnulib-generated assert.h overrides _Static_assert here:
# elif !defined _GL_HAVE__STATIC_ASSERT1 && !defined _Static_assert
# if !defined _MSC_VER || defined __clang__
# define _Static_assert(...) \
_GL_STATIC_ASSERT (__VA_ARGS__, "static assertion failed", -)
However, in gnu99 mode, no overriding happens because <sys/cdefs.h>
from glibc 2.31 has already defined _Static_assert (the old glibc lacks
the check for __clang_major__):
#if (!defined _Static_assert && !defined __cplusplus \
&& (defined __STDC_VERSION__ ? __STDC_VERSION__ : 0) < 201112 \
&& (!__GNUC_PREREQ (4, 6) || defined __STRICT_ANSI__))
# define _Static_assert(expr, diagnostic) \
extern int (*__Static_assert_function (void)) \
[!!sizeof (struct { int __error_if_negative: (expr) ? 2 : -1; })]
#endif
I attached patches. The first one adds a comment related to this issue.
The second patch fixes the groff build (even if ac_cv_prog_cc_c11=no
isn't removed). I didn't do other testing.
--
Lasse Collin
>From 5bb11a0b5d0ada27eac01ff6127191c70d756273 Mon Sep 17 00:00:00 2001
From: Lasse Collin <[email protected]>
Date: Sat, 8 Aug 2026 13:30:08 +0300
Subject: [PATCH 1/2] verify: Add a comment about Clang on Mac OS 10.7.5
* lib/verify.h: The existing comment says "clang 4+" but the #if
checks for 5 <= __clang_major__. The mismatch looked like a bug.
Add a comment based on the commit 0cda5beb7962 ("verify: port to
Mac OS 10.7.5") to explain why the condition checks for 5 <=.
---
ChangeLog | 8 ++++++++
lib/verify.h | 2 ++
2 files changed, 10 insertions(+)
diff --git a/ChangeLog b/ChangeLog
index dcc91e5ba5..9bb4925f75 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2026-08-08 Lasse Collin <[email protected]>
+
+ verify: Add a comment about Clang on Mac OS 10.7.5.
+ * lib/verify.h: The existing comment says "clang 4+" but the #if
+ checks for 5 <= __clang_major__. The mismatch looked like a bug.
+ Add a comment based on the commit 0cda5beb7962 ("verify: port to
+ Mac OS 10.7.5") to explain why the condition checks for 5 <=.
+
2026-08-07 Bruno Haible <[email protected]>
Fix position of _GL_ATTRIBUTE_REPRODUCIBLE in last commit.
diff --git a/lib/verify.h b/lib/verify.h
index 7daa20eb6f..7d3a6de49e 100644
--- a/lib/verify.h
+++ b/lib/verify.h
@@ -23,6 +23,8 @@
/* Define _GL_HAVE__STATIC_ASSERT to 1 if _Static_assert (R, DIAGNOSTIC)
works as per C11. This is supported by GCC 4.6.0+ and by clang 4+.
+ Check for Clang >= 5 instead of >= 4 because clang on Mac OS 10.7.5
+ sets __clang_major__ to 4 even though it was derived from Clang 3.2.
Define _GL_HAVE__STATIC_ASSERT1 to 1 if _Static_assert (R) works as
per C23. This is supported by GCC 9.1+.
--
2.55.0
>From 79e9a4a0093ebdea1ea00f9d27f1a35120cdd511 Mon Sep 17 00:00:00 2001
From: Lasse Collin <[email protected]>
Date: Sat, 8 Aug 2026 13:30:08 +0300
Subject: [PATCH 2/2] verify: Fix single-argument static_assert with glibc in
C89 & C99 modes
* lib/verify.h: glibc's <sys/cdefs.h> may define _Static_assert
with two arguments when the compiler is in C89 or C99 mode.
Undefine it so that Gnulib's own version is used instead.
Reported by G. Branden Robinson in
<https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00125.html>.
---
ChangeLog | 9 +++++++++
lib/verify.h | 10 ++++++++++
2 files changed, 19 insertions(+)
diff --git a/ChangeLog b/ChangeLog
index 9bb4925f75..3f6840afb6 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2026-08-08 Lasse Collin <[email protected]>
+
+ verify: Fix single-argument static_assert with glibc in C89 & C99 modes.
+ * lib/verify.h: glibc's <sys/cdefs.h> may define _Static_assert
+ with two arguments when the compiler is in C89 or C99 mode.
+ Undefine it so that Gnulib's own version is used instead.
+ Reported by G. Branden Robinson in
+ <https://lists.gnu.org/archive/html/bug-gnulib/2026-08/msg00125.html>.
+
2026-08-08 Lasse Collin <[email protected]>
verify: Add a comment about Clang on Mac OS 10.7.5.
diff --git a/lib/verify.h b/lib/verify.h
index 7d3a6de49e..62a2bbca75 100644
--- a/lib/verify.h
+++ b/lib/verify.h
@@ -46,6 +46,16 @@
# endif
#endif
+/* <sys/cdefs.h> in glibc may define _Static_assert with two arguments if the
+ compiler is in C89 or C99 mode. This matters especially with Clang:
+ (1) glibc < 2.34, before the commit c8ba52ab3350 ("misc: Sync cdefs.h
+ with gnulib"), doesn't check for __clang_major__ >= 4.
+ (2) The above condition for _GL_HAVE__STATIC_ASSERT checks for
+ __clang_major__ >= 5, so it's not in sync with glibc. */
+#if __STDC_VERSION__ < 201112 && defined __GLIBC__
+# undef _Static_assert
+#endif
+
/* FreeBSD 9.1 <sys/cdefs.h>, included by <stddef.h> and lots of other
system headers, defines a conflicting _Static_assert that is no
better than ours; override it unless Gnulib's replacement <assert.h>
--
2.55.0