Skip to content

Commit c6daaad

Browse files
pks-tdscho
authored andcommitted
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> Assisted-by: Opus 4.7 Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
1 parent 212df3c commit c6daaad

2 files changed

Lines changed: 13 additions & 0 deletions

File tree

config.mak.dev

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ endif
9898
endif
9999
endif
100100

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+
101108
# https://bugzilla.redhat.com/show_bug.cgi?id=2075786
102109
ifneq ($(filter gcc12,$(COMPILER_FEATURES)),)
103110
DEVELOPER_CFLAGS += -Wno-error=stringop-overread

meson.build

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,6 +866,12 @@ if get_option('warning_level') in ['2','3', 'everything'] and compiler.get_argum
866866
libgit_c_args += cflag
867867
endif
868868
endforeach
869+
870+
# Clang generates warnings when compiling glibc 2.43 because of the use of
871+
# _Generic.
872+
if compiler.get_id() == 'clang'
873+
libgit_c_args += '-Wno-c11-extensions'
874+
endif
869875
endif
870876

871877
if get_option('breaking_changes')

0 commit comments

Comments
 (0)