]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/57709 (-Wshadow is too strict / has false positives)
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Fri, 22 Aug 2014 19:12:46 +0000 (19:12 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Fri, 22 Aug 2014 19:12:46 +0000 (19:12 +0000)
gcc/cp/ChangeLog:

2014-08-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c++/57709
* name-lookup.c (pushdecl_maybe_friend_1): Do not warn if a
declaration shadows a function declaration, unless the former
declares a function, pointer to function or pointer to member
function, because this is a common and valid case in real-world
code.
* cp-tree.h (TYPE_PTRFN_P,TYPE_REFFN_P,TYPE_PTRMEMFUNC_P):
Improve description.

gcc/testsuite/ChangeLog:

2014-08-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>

PR c++/57709
* g++.dg/Wshadow.C: New test.

From-SVN: r214357

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/name-lookup.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/Wshadow.C [new file with mode: 0644]

index 649941c7b54aef14d5d71b41bd641eae74b57a89..2ea266539017debcbcc973920405cc72332053af 100644 (file)
@@ -1,3 +1,14 @@
+2014-08-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c++/57709
+       * name-lookup.c (pushdecl_maybe_friend_1): Do not warn if a
+       declaration shadows a function declaration, unless the former
+       declares a function, pointer to function or pointer to member
+       function, because this is a common and valid case in real-world
+       code.
+       * cp-tree.h (TYPE_PTRFN_P,TYPE_REFFN_P,TYPE_PTRMEMFUNC_P):
+       Improve description.
+
 2014-08-22  Jason Merrill  <jason@redhat.com>
 
        PR c++/62129
index 34373b7456fc80c9eaec7f0fda5925284a50fe29..81c7fd6b99c1f8369246a28db5fdff8ef3096a6b 100644 (file)
@@ -3558,18 +3558,17 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
    && !(TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE          \
        || TREE_CODE (TREE_TYPE (NODE)) == METHOD_TYPE))
 
-/* Returns true if NODE is a pointer to function.  */
+/* Returns true if NODE is a pointer to function type.  */
 #define TYPE_PTRFN_P(NODE)                             \
   (TYPE_PTR_P (NODE)                                   \
    && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
 
-/* Returns true if NODE is a reference to function.  */
+/* Returns true if NODE is a reference to function type.  */
 #define TYPE_REFFN_P(NODE)                             \
   (TREE_CODE (NODE) == REFERENCE_TYPE                  \
    && TREE_CODE (TREE_TYPE (NODE)) == FUNCTION_TYPE)
 
-/* Nonzero for _TYPE node means that this type is a pointer to member
-   function type.  */
+/* Returns true if NODE is a pointer to member function type.  */
 #define TYPE_PTRMEMFUNC_P(NODE)                \
   (TREE_CODE (NODE) == RECORD_TYPE     \
    && TYPE_PTRMEMFUNC_FLAG (NODE))
index 6e779a614bea8c5581ce6cd89b95649301465a60..ebcbb5c5580f4933a7252d76a70a83de943a6f36 100644 (file)
@@ -1239,9 +1239,24 @@ pushdecl_maybe_friend_1 (tree x, bool is_friend)
 
              if (member && !TREE_STATIC (member))
                {
-                 /* Location of previous decl is not useful in this case.  */
-                 warning (OPT_Wshadow, "declaration of %qD shadows a member of 'this'",
-                          x);
+                 if (BASELINK_P (member))
+                   member = BASELINK_FUNCTIONS (member);
+                 member = OVL_CURRENT (member);
+       
+                 /* Do not warn if a variable shadows a function, unless
+                    the variable is a function or a pointer-to-function.  */
+                 if (TREE_CODE (member) != FUNCTION_DECL
+                     || TREE_CODE (x) == FUNCTION_DECL
+                     || TYPE_PTRFN_P (TREE_TYPE (x))
+                     || TYPE_PTRMEMFUNC_P (TREE_TYPE (x)))
+                   {
+                     if (warning_at (input_location, OPT_Wshadow,
+                                     "declaration of %qD shadows a member of %qT",
+                                     x, current_nonlambda_class_type ())
+                         && DECL_P (member))
+                       inform (DECL_SOURCE_LOCATION (member),
+                               "shadowed declaration is here");
+                   }
                }
              else if (oldglobal != NULL_TREE
                       && (VAR_P (oldglobal)
index a6415d6e4099f5e8cda4d69916a6b1e981d92a16..ce3e30e3572f33a7140364a20ff4a5dcfbbe011a 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-22  Manuel López-Ibáñez  <manu@gcc.gnu.org>
+
+       PR c++/57709
+       * g++.dg/Wshadow.C: New test.
+
 2014-08-22  Steven Bosscher  <steven@gcc.gnu.org>
 
        PR fortran/62135
diff --git a/gcc/testsuite/g++.dg/Wshadow.C b/gcc/testsuite/g++.dg/Wshadow.C
new file mode 100644 (file)
index 0000000..482d2f0
--- /dev/null
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-Wshadow" }
+// PR c++/57709 
+class C {
+  int both_var; // { dg-message "declaration" }
+  void var_and_method(void) {} // { dg-message "declaration" }
+  void m() { 
+    int 
+      both_var,  // { dg-warning "shadows" }
+      var_and_method; 
+  }
+  void m2() { 
+    void (C::*var_and_method)(void); // { dg-warning "shadows" }
+  }
+};