This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch for bug 529
- From: "Joseph S. Myers" <joseph at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 29 Jul 2005 23:58:36 +0000 (UTC)
- Subject: Patch for bug 529
This patch fixes bug 529 (useless -Wshadow warnings for declarations
at function prototype scope).
Bootstrapped with no regressions on x86_64-unknown-linux-gnu. Applied
to mainline.
--
Joseph S. Myers http://www.srcf.ucam.org/~jsm28/gcc/
jsm@polyomino.org.uk (personal mail)
joseph@codesourcery.com (CodeSourcery mail)
jsm28@gcc.gnu.org (Bugzilla assignments and CCs)
2005-07-29 Joseph S. Myers <joseph@codesourcery.com>
PR c/529
* c-decl.c (warn_if_shadowing): Don't check for PARM_DECL in
nested function declarators.
(pushdecl): Don't call warn_if_shadowing for PARM_DECL.
(grokparms): Call warn_if_shadowing for parameters used within the
parameter list.
(store_parm_decls_newstyle): Call warn_if_shadowing for parameters
not used within the parameter list.
(store_parm_decls_oldstyle): Call warn_if_shadowing for parameters.
testsuite:
2005-07-29 Joseph S. Myers <joseph@codesourcery.com>
PR c/529
* gcc.dg/Wshadow-3.c: New test.
diff -rupN GCC.orig/gcc/c-decl.c GCC/gcc/c-decl.c
--- GCC.orig/gcc/c-decl.c 2005-07-20 20:10:25.000000000 +0000
+++ GCC/gcc/c-decl.c 2005-07-29 22:15:41.000000000 +0000
@@ -1891,13 +1891,7 @@ warn_if_shadowing (tree new_decl)
/* No shadow warnings for internally generated vars. */
|| DECL_IS_BUILTIN (new_decl)
/* No shadow warnings for vars made for inlining. */
- || DECL_FROM_INLINE (new_decl)
- /* Don't warn about the parm names in function declarator
- within a function declarator. It would be nice to avoid
- warning in any function declarator in a declaration, as
- opposed to a definition, but there is no way to tell
- it's not a definition at this point. */
- || (TREE_CODE (new_decl) == PARM_DECL && current_scope->outer->parm_flag))
+ || DECL_FROM_INLINE (new_decl))
return;
/* Is anything being shadowed? Invisible decls do not count. */
@@ -2221,7 +2215,8 @@ pushdecl (tree x)
}
}
- warn_if_shadowing (x);
+ if (TREE_CODE (x) != PARM_DECL)
+ warn_if_shadowing (x);
skip_external_and_shadow_checks:
if (TREE_CODE (x) == TYPE_DECL)
@@ -4836,6 +4831,9 @@ grokparms (struct c_arg_info *arg_info,
parm, parmno);
}
}
+
+ if (DECL_NAME (parm) && TREE_USED (parm))
+ warn_if_shadowing (parm);
}
return arg_types;
}
@@ -6106,8 +6104,12 @@ store_parm_decls_newstyle (tree fndecl,
{
DECL_CONTEXT (decl) = current_function_decl;
if (DECL_NAME (decl))
- bind (DECL_NAME (decl), decl, current_scope,
- /*invisible=*/false, /*nested=*/false);
+ {
+ bind (DECL_NAME (decl), decl, current_scope,
+ /*invisible=*/false, /*nested=*/false);
+ if (!TREE_USED (decl))
+ warn_if_shadowing (decl);
+ }
else
error ("%Jparameter name omitted", decl);
}
@@ -6181,6 +6183,7 @@ store_parm_decls_oldstyle (tree fndecl,
DECL_ARG_TYPE (decl) = integer_type_node;
layout_decl (decl, 0);
}
+ warn_if_shadowing (decl);
}
/* If no declaration found, default to int. */
else
@@ -6189,6 +6192,7 @@ store_parm_decls_oldstyle (tree fndecl,
DECL_ARG_TYPE (decl) = TREE_TYPE (decl);
DECL_SOURCE_LOCATION (decl) = DECL_SOURCE_LOCATION (fndecl);
pushdecl (decl);
+ warn_if_shadowing (decl);
if (flag_isoc99)
pedwarn ("type of %q+D defaults to %<int%>", decl);
diff -rupN GCC.orig/gcc/testsuite/gcc.dg/Wshadow-3.c GCC/gcc/testsuite/gcc.dg/Wshadow-3.c
--- GCC.orig/gcc/testsuite/gcc.dg/Wshadow-3.c 1970-01-01 00:00:00.000000000 +0000
+++ GCC/gcc/testsuite/gcc.dg/Wshadow-3.c 2005-07-29 22:40:20.000000000 +0000
@@ -0,0 +1,21 @@
+/* Test warnings for shadowing in function prototype scope: generally
+ useless but of use if the parameter is used within the scope. Bug
+ 529. */
+/* Origin: Joseph Myers <joseph@codesourcery.com> */
+/* { dg-do compile } */
+/* { dg-options "-std=gnu89 -Wshadow" } */
+
+int v; /* { dg-warning "shadowed declaration" } */
+int f1(int v);
+int f2(int v, int x[v]); /* { dg-warning "warning: declaration of 'v' shadows a global declaration" } */
+int f3(int v, int y[sizeof(v)]); /* { dg-warning "warning: declaration of 'v' shadows a global declaration" } */
+int f4(int v) { return 0; } /* { dg-warning "warning: declaration of 'v' shadows a global declaration" } */
+int f5(int v, int x[v]) { return 0; } /* { dg-warning "warning: declaration of 'v' shadows a global declaration" } */
+int f6(int x) { return 0; }
+int f7(v) int v; { return 0; } /* { dg-warning "warning: declaration of 'v' shadows a global declaration" } */
+int f8(v, w) int v; int w[v]; { return 0; } /* { dg-warning "warning: declaration of 'v' shadows a global declaration" } */
+int f9(x) int x; { return 0; }
+int f10(v) { return 0; } /* { dg-warning "warning: declaration of 'v' shadows a global declaration" } */
+int f11(int a, int b(int a));
+int f12(int a, int b(int a, int x[a])); /* { dg-warning "warning: declaration of 'a' shadows a parameter" } */
+/* { dg-warning "shadowed declaration" "outer parm" { target *-*-* } 20 } */