re PR c++/57709 (-Wshadow is too strict / has false positives)

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
parent 6c6d76be
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
......
......@@ -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))
......
......@@ -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)
......
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
......
// { 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" }
}
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment