===================================================================
@@ -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" }
+ }
+};
===================================================================
@@ -1237,13 +1237,28 @@ pushdecl_maybe_friend_1 (tree x, bool is
else
member = NULL_TREE;
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
+ && !(FUNCTION_POINTER_TYPE_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)
/* If the old decl is a type decl, only warn if the
old decl is an explicit typedef or if both the