+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
&& !(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))
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)
+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
--- /dev/null
+// { 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" }
+ }
+};