re PR c++/39763 (-Wshadow reports shadowed declarations for parameters of unnamed...
authorJason Merrill <jason@redhat.com>
Tue, 14 Apr 2009 17:04:04 +0000 (13:04 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 14 Apr 2009 17:04:04 +0000 (13:04 -0400)
PR c++/39763
* name-lookup.c (pushdecl_maybe_friend): Avoid all warnings
about shadowing by tentative parms.

From-SVN: r146053

gcc/cp/ChangeLog
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/warn/Wshadow-4.C

index d7db8656b1cad7d017a9fae6928d50e134469d4c..e335f9e18305659cbf2c37815e853b4228f91fae 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-14  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39763
+       * name-lookup.c (pushdecl_maybe_friend): Avoid all warnings
+       about shadowing by tentative parms.
+
 2009-04-13  Jason Merrill  <jason@redhat.com>
 
        PR c++/39480
index 2eebb79f278ee841106ee0ae9b509fcee306b5b6..b47c0c55fd86e65186be68d308f40fc9aaaa2dc0 100644 (file)
@@ -1008,13 +1008,18 @@ pushdecl_maybe_friend (tree x, bool is_friend)
              && 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;
 
@@ -1038,10 +1043,7 @@ pushdecl_maybe_friend (tree x, bool is_friend)
                    }
                }
 
-             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);
index d3405bee457594cdda5f7568a826ba81c8be4402..d0473e7ca07e237580f67d8b0b158d88176fb64a 100644 (file)
@@ -1,3 +1,8 @@
+2009-04-14  Jason Merrill  <jason@redhat.com>
+
+       PR c++/39763
+       * g++.dg/warn/Wshadow-4.C: Extend.
+
 2009-04-14  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/alpha/pr39740.c (dg-options): Add -mexplicit-relocs.
index 16399b2fb60d44196492e39e8a41f6fc156dc9f1..22386534bdb382325be94e2bf6828a659c30ce34 100644 (file)
@@ -18,3 +18,15 @@ int foo(int infoo)           // { dg-warning "shadowed declaration" }
   };
   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;
+}