Re: [RFC/PATCH] git-compat-util.h: Don't define NORETURN under __clang__
From: Matthieu Moy <hidden>
Date: 2016-06-15 22:49:14
Ævar Arnfjörð Bjarmason venit, vidit, dixit 03.08.2010 15:08:
clang version 1.0 on Debian testing x86_64 defines __GNUC__, but barfs
on `void __attribute__((__noreturn__))'. E.g.:
usage.c:56:1: error: function declared 'noreturn' should not return [-Winvalid-noreturn]
}
^
1 diagnostic generated.
make: *** [usage.o] Error 1
It doesn't mean that it's not accepting __noreturn__, it means it was
not smart enough to check that the function do not return.
In my git, usage.c:56: leads me to this function:
void usagef(const char *err, ...)
{
va_list params;
va_start(params, err);
usage_routine(err, params);
va_end(params);
}
The absence of return comes from usage_routine, which is a pointer to
function, and it seems your version of clang doesn't handle
__noreturn__ pointers to functions properly.
On my box:
git$ make -B CC=clang V=yes usage.o
clang -o usage.o -c -g -Wall -Werror -I. -DHAVE_PATHS_H -DSHA1_HEADER='<openssl/sha.h>' -DNO_STRLCPY -DNO_MKSTEMPS usage.c
git$ clang --version
clang version 1.1 (branches/release_27)
Target: i386-pc-linux-gnu
Thread model: posix
so, more recent clang do not seem to have this issue.
quoted hunk
diff --git a/git-compat-util.h b/git-compat-util.h index 02a73ee..c651cb7 100644 --- a/git-compat-util.h +++ b/git-compat-util.h@@ -183,7 +183,10 @@ extern char *gitbasename(char *); #define is_dir_sep(c) ((c) == '/') #endif -#ifdef __GNUC__ +#ifdef __clang__ +#define NORETURN +#define NORETURN_PTR __attribute__((__noreturn__)) +#elif __GNUC__
If you go for something like this, you should check the version of clang, and special-case only version < 1.1. But I'm not sure special-casing old version of a young compiler really makes sense. We're only talking about warnings here, so I'd say you should either upgrade clang or remove -Werror from your CFLAGS. (other than that, it's cool to see someone testing another compiler ;-) ) -- Matthieu Moy http://www-verimag.imag.fr/~moy/