sgallagh / rpms / gcc

Forked from rpms/gcc 4 years ago
Clone
Blob Blame History Raw
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.

	* 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  <jason@redhat.com>
 
 	PR c++/39480