]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
build-sys: Check behavior of -Werror=shadow before deciding to use it 1341/head
authorFilipe Brandenburger <filbranden@google.com>
Sat, 5 Sep 2015 23:52:51 +0000 (16:52 -0700)
committerFilipe Brandenburger <filbranden@google.com>
Tue, 22 Sep 2015 16:54:33 +0000 (09:54 -0700)
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.

configure.ac
m4/attributes.m4

index d71cb07366177f0b2e349dd2ce2de2a40f2439bb..5cdd1d146274d04c3a5eba3aabf6177caef8d800 100644 (file)
@@ -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 \
index 4b0fcdce3deb178b13fcc5b591b10a42fc2e419e..db5df250f451054441b216f6372baa784b12502d 100644 (file)
@@ -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
 ])