mirror of
https://github.com/systemd/systemd-stable.git
synced 2024-12-22 13:33:56 +03:00
build-sys: Check behavior of -Werror=shadow before deciding to use it
gcc versions 4.6 and earlier used to complain when a local variable shadows a global function, 4.7 and above only complain if a local variable shadows a global variable. Fix this by checking whether gcc 4.7+ behavior is in place before deciding to use -Werror=shadow in $(CFLAGS), by using a custom test program source that shadows a global function with a local variable and confirming that -Werror=shadow does not make the compile to break. Tested: - On gcc 4.7 and 4.8, confirmed nothing changed (other than the order of the -Werror=shadow argument, going to the end of CFLAGS.) - On gcc 4.6, confirmed by looking at the config.log output that the check for -Werror=shadow failed and it was not included in CFLAGS. - Ran `make V=1` to confirm -Werror=shadow was still in use, introduced a bogus shadowing issue and confirmed it was caught when building with a recent gcc.
This commit is contained in:
parent
6a937f0645
commit
a01a4517e1
12
configure.ac
12
configure.ac
@ -171,7 +171,6 @@ CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
|
||||
-Werror=implicit-function-declaration \
|
||||
-Werror=missing-declarations \
|
||||
-Werror=return-type \
|
||||
-Werror=shadow \
|
||||
-Wstrict-prototypes \
|
||||
-Wredundant-decls \
|
||||
-Wmissing-noreturn \
|
||||
@ -196,6 +195,17 @@ CC_CHECK_FLAGS_APPEND([with_cflags], [CFLAGS], [\
|
||||
-fPIE \
|
||||
--param=ssp-buffer-size=4])
|
||||
|
||||
CC_CHECK_FLAG_APPEND([with_cflags], [CFLAGS], [-Werror=shadow], [
|
||||
#include <time.h>
|
||||
#include <inttypes.h>
|
||||
typedef uint64_t usec_t;
|
||||
usec_t now(clockid_t clock);
|
||||
int main(void) {
|
||||
struct timespec now;
|
||||
return 0;
|
||||
}
|
||||
])
|
||||
|
||||
AS_CASE([$CC], [*clang*],
|
||||
[CC_CHECK_FLAGS_APPEND([with_cppflags], [CPPFLAGS], [\
|
||||
-Wno-typedef-redefinition \
|
||||
|
@ -35,15 +35,18 @@ dnl well.
|
||||
|
||||
dnl Check if FLAG in ENV-VAR is supported by compiler and append it
|
||||
dnl to WHERE-TO-APPEND variable. Note that we invert -Wno-* checks to
|
||||
dnl -W* as gcc cannot test for negated warnings.
|
||||
dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG])
|
||||
dnl -W* as gcc cannot test for negated warnings. If a C snippet is passed,
|
||||
dnl use it, otherwise use a simple main() definition that just returns 0.
|
||||
dnl CC_CHECK_FLAG_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG], [C-SNIPPET])
|
||||
|
||||
AC_DEFUN([CC_CHECK_FLAG_APPEND], [
|
||||
AC_CACHE_CHECK([if $CC supports flag $3 in envvar $2],
|
||||
AS_TR_SH([cc_cv_$2_$3]),
|
||||
[eval "AS_TR_SH([cc_save_$2])='${$2}'"
|
||||
eval "AS_TR_SH([$2])='-Werror `echo "$3" | sed 's/^-Wno-/-W/'`'"
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([int main(void) { return 0; } ])],
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE(ifelse([$4], [],
|
||||
[int main(void) { return 0; } ],
|
||||
[$4]))],
|
||||
[eval "AS_TR_SH([cc_cv_$2_$3])='yes'"],
|
||||
[eval "AS_TR_SH([cc_cv_$2_$3])='no'"])
|
||||
eval "AS_TR_SH([$2])='$cc_save_$2'"])
|
||||
@ -52,10 +55,10 @@ AC_DEFUN([CC_CHECK_FLAG_APPEND], [
|
||||
[eval "$1='${$1} $3'"])
|
||||
])
|
||||
|
||||
dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2])
|
||||
dnl CC_CHECK_FLAGS_APPEND([WHERE-TO-APPEND], [ENV-VAR], [FLAG1 FLAG2], [C-SNIPPET])
|
||||
AC_DEFUN([CC_CHECK_FLAGS_APPEND], [
|
||||
for flag in [$3]; do
|
||||
CC_CHECK_FLAG_APPEND([$1], [$2], $flag)
|
||||
CC_CHECK_FLAG_APPEND([$1], [$2], $flag, [$4])
|
||||
done
|
||||
])
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user