summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilipe Brandenburger <filbranden@google.com>2015-09-05 16:52:51 -0700
committerFilipe Brandenburger <filbranden@google.com>2015-09-22 09:54:33 -0700
commita01a4517e16c532fbd5203fbfe2571255e2cd312 (patch)
tree8dd5d51839ebd7b5fb173a13ac65ba8f85f045ec
parent6a937f0645ab335ef13a79951c3e94d6d8becea9 (diff)
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.
-rw-r--r--configure.ac12
-rw-r--r--m4/attributes.m413
2 files changed, 19 insertions, 6 deletions
diff --git a/configure.ac b/configure.ac
index d71cb07366..5cdd1d1462 100644
--- a/configure.ac
+++ b/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 \
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
])