On Sun, 16 Oct 2016, Philip Guenther wrote:
> So let's fix that and make our gcc a bit more like new ones. Written
> without peeking at the new ones and tested against the .c file at bottom
> to verify that it doesn't fail or crash on some weird combo of
> shadowing.
>
> oks?
Updated diff that *keeps* the shadow warning for a function parameter
which is a pointer-to-function and which shadows a global function, e.g.:
#include <err.h>
void
foo( void (*err)(void) )
{
err();
}
Previous diff suppressed the warning on the 'err' parameter; this revised
diff keeps it.
oks?
Philip
Index: gnu/gcc/gcc/c-decl.c
===================================================================
RCS file: /cvs/src/gnu/gcc/gcc/c-decl.c,v
retrieving revision 1.4
diff -u -p -r1.4 c-decl.c
--- gnu/gcc/gcc/c-decl.c 10 Sep 2015 10:56:35 -0000 1.4
+++ gnu/gcc/gcc/c-decl.c 17 Oct 2016 18:18:36 -0000
@@ -1946,8 +1946,20 @@ warn_if_shadowing (tree new_decl)
warning (OPT_Wshadow, "declaration of %q+D shadows a parameter",
new_decl);
else if (DECL_FILE_SCOPE_P (old_decl))
- warning (OPT_Wshadow, "declaration of %q+D shadows a global "
- "declaration", new_decl);
+ {
+ /* Don't warn about shadowing a global function unless the local
+ variable or parameter is a pointer to a function */
+ if (TREE_CODE (old_decl) == FUNCTION_DECL
+ && TREE_CODE (new_decl) != FUNCTION_DECL
+ && ((TREE_CODE (new_decl) != VAR_DECL
+ && TREE_CODE (new_decl) != PARM_DECL)
+ || !POINTER_TYPE_P (TREE_TYPE (new_decl))
+ || TREE_CODE (TREE_TYPE (TREE_TYPE (new_decl)))
+ != FUNCTION_TYPE))
+ break;
+ warning (OPT_Wshadow, "declaration of %q+D shadows a global "
+ "declaration", new_decl);
+ }
else if (TREE_CODE (old_decl) == FUNCTION_DECL
&& DECL_BUILT_IN (old_decl))
{