2009-04-14 Jason Merrill PR c++/39763 * name-lookup.c (pushdecl_maybe_friend): Avoid all warnings about shadowing by tentative parms. * g++.dg/warn/Wshadow-4.C: Extend. --- gcc/cp/name-lookup.c (revision 146053) +++ gcc/cp/name-lookup.c (revision 146054) @@ -1002,13 +1002,18 @@ pushdecl_maybe_friend (tree x, bool is_f && TREE_PUBLIC (x)) TREE_PUBLIC (name) = 1; + /* Don't complain about the parms we push and then pop + while tentatively parsing a function declarator. */ + if (TREE_CODE (x) == PARM_DECL && DECL_CONTEXT (x) == NULL_TREE) + /* Ignore. */; + /* Warn if shadowing an argument at the top level of the body. */ - if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x) - /* Inline decls shadow nothing. */ - && !DECL_FROM_INLINE (x) - && TREE_CODE (oldlocal) == PARM_DECL - /* Don't check the `this' parameter. */ - && !DECL_ARTIFICIAL (oldlocal)) + else if (oldlocal != NULL_TREE && !DECL_EXTERNAL (x) + /* Inline decls shadow nothing. */ + && !DECL_FROM_INLINE (x) + && TREE_CODE (oldlocal) == PARM_DECL + /* Don't check the `this' parameter. */ + && !DECL_ARTIFICIAL (oldlocal)) { bool err = false; @@ -1032,10 +1037,7 @@ pushdecl_maybe_friend (tree x, bool is_f } } - if (warn_shadow && !err - /* Don't complain about the parms we push and then pop - while tentatively parsing a function declarator. */ - && !(TREE_CODE (x) == PARM_DECL && DECL_CONTEXT (x) == NULL_TREE)) + if (warn_shadow && !err) { warning (OPT_Wshadow, "declaration of %q#D shadows a parameter", x); warning (OPT_Wshadow, "%Jshadowed declaration is here", oldlocal); --- gcc/testsuite/g++.dg/warn/Wshadow-4.C (revision 146053) +++ gcc/testsuite/g++.dg/warn/Wshadow-4.C (revision 146054) @@ -18,3 +18,15 @@ int foo(int infoo) // { dg-warning "sha }; return outfoo; } + +// PR c++/39763 +int foo2(void) +{ + int infoo = 0; // { dg-warning "shadowed declaration" } + int outfoo( INetURLObject( infoo ).GetMainURL()); // { dg-bogus "shadows" } + struct A + { + void f(int infoo) { } // { dg-warning "shadows a previous local" } + }; + return outfoo; +} 2009-04-13 Jason Merrill PR c++/39480