build: tolerate use of _Generic from glibc 2.43 with Clang

When building with `make DEVELOPER=1` we explicitly pass "-std=gnu99" to the compiler so that we don't start leaning on features exposed by more recent versions of the C standard. Unfortunately though, glibc 2.43 started to use type-generic expressions. This works alright with GCC, but when compiling with Clang this leads to errors: $ make DEVELOPER=1 CC=clang CC daemon.o In file included from daemon.c:3: ./git-compat-util.h:344:11: error: '_Generic' is a C11 extension [-Werror,-Wc11-extensions] 344 | return !!strchr(path, '/'); | ^ /usr/include/string.h:265:3: note: expanded from macro 'strchr' 265 | __glibc_const_generic (S, const char *, strchr (S, C)) | ^ /usr/include/x86_64-linux-gnu/sys/cdefs.h:838:3: note: expanded from macro '__glibc_const_generic' 838 | _Generic (0 ? (PTR) : (void *) 1, \ | ^ In theory, the `__glibc_const_generic` macro does have feature gating: #if !defined __cplusplus \ && (__GNUC_PREREQ (4, 9) \ || __glibc_has_extension (c_generic_selections) \ || (!defined __GNUC__ && defined __STDC_VERSION__ \ && __STDC_VERSION__ >= 201112L)) # define __HAVE_GENERIC_SELECTION 1 #else # define __HAVE_GENERIC_SELECTION 0 #endif But this feature gating isn't effective because `_has_extension()` will always evaluate to true as C generics _are_ available as a language extension to GNU C99 when using Clang. This would have been different if `_has_feature()` was used instead, in which case it would have properly evaluated to `false`. GCC has a workaround to squelch this warning from standard system headers, but because clang fails due to [-Werror,-Wc11-extensions], as it lacks the corresponding workaround. For both meson and Makefile, pass -Wno-c11-extensions when we are building with clang. Signed-off-by: Patrick Steinhardt <ps@pks.im> Helped-by: Shardul Natu <snatu@google.com> [jc: replaced Makefile side with Shardul's approach] Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed May 11, 2026 at 14:20 UTC 0a6d29090cbdb6822039510885011d8011e04e21
2 files changed +13
config.mak.dev
+7
@@ -98,6 +98,13 @@ endif
98 endif
99 endif
100
101 +# glibc 2.43 headers unconditionally use _Generic even when we ask the
102 +# compiler to stick to -std=gnu99 and unlike GCC, clang lacks a
103 +# workaround to squelch warnings from system headers.
104 +ifneq ($(filter clang1,$(COMPILER_FEATURES)),) # if we are using clang
105 +DEVELOPER_CFLAGS += -Wno-c11-extensions
106 +endif
107 +
108 # https://bugzilla.redhat.com/show_bug.cgi?id=2075786
109 ifneq ($(filter gcc12,$(COMPILER_FEATURES)),)
110 DEVELOPER_CFLAGS += -Wno-error=stringop-overread
meson.build
+6
@@ -854,6 +854,12 @@ if get_option('warning_level') in ['2','3', 'everything'] and compiler.get_argum
854 libgit_c_args += cflag
855 endif
856 endforeach
857 +
858 + # Clang generates warnings when compiling glibc 2.43 because of the use of
859 + # _Generic.
860 + if compiler.get_id() == 'clang'
861 + libgit_c_args += '-Wno-c11-extensions'
862 + endif
863 endif
864
865 if get_option('breaking_changes')