From a01a4517e16c532fbd5203fbfe2571255e2cd312 Mon Sep 17 00:00:00 2001 From: Filipe Brandenburger Date: Sat, 5 Sep 2015 16:52:51 -0700 Subject: 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. --- m4/attributes.m4 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'm4') diff --git a/m4/attributes.m4 b/m4/attributes.m4 index 4b0fcdce3d..db5df250f4 100644 --- a/m4/attributes.m4 +++ b/m4/attributes.m4 @@ -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 ]) -- cgit v1.2.3-54-g00ecf