re PR c++/16169 (-Weffc++ item 15 improvements)
PR c++/16169 * typeck.c (check_return_expr): Improve -Weffc++ warning: handle returning CALL_EXPR, and non-reference return type. PR c++/16169 * g++.dg/warn/effc2.C: New test. From-SVN: r84283
This commit is contained in:
parent
70ce47b582
commit
47293da314
@ -1,3 +1,9 @@
|
||||
2004-07-08 Giovanni Bajo <giovannibajo@gcc.gnu.org>
|
||||
|
||||
PR c++/16169
|
||||
* typeck.c (check_return_expr): Improve -Weffc++ warning: handle
|
||||
returning CALL_EXPR, and non-reference return type.
|
||||
|
||||
2004-07-08 Nathan Sidwell <nathan@codesourcery.com>
|
||||
|
||||
* name-lookup.c (push_binding): Use VEC_reserve.
|
||||
|
@ -5989,9 +5989,29 @@ check_return_expr (tree retval)
|
||||
|
||||
/* Effective C++ rule 15. See also start_function. */
|
||||
if (warn_ecpp
|
||||
&& DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR)
|
||||
&& retval != current_class_ref)
|
||||
warning ("`operator=' should return a reference to `*this'");
|
||||
&& DECL_NAME (current_function_decl) == ansi_assopname(NOP_EXPR))
|
||||
{
|
||||
bool warn = true;
|
||||
|
||||
/* The function return type must be a reference to the current
|
||||
class. */
|
||||
if (TREE_CODE (valtype) == REFERENCE_TYPE
|
||||
&& same_type_ignoring_top_level_qualifiers_p
|
||||
(TREE_TYPE (valtype), TREE_TYPE (current_class_ref)))
|
||||
{
|
||||
/* Returning '*this' is obviously OK. */
|
||||
if (retval == current_class_ref)
|
||||
warn = false;
|
||||
/* If we are calling a function whose return type is the same of
|
||||
the current class reference, it is ok. */
|
||||
else if (TREE_CODE (retval) == INDIRECT_REF
|
||||
&& TREE_CODE (TREE_OPERAND (retval, 0)) == CALL_EXPR)
|
||||
warn = false;
|
||||
}
|
||||
|
||||
if (warn)
|
||||
warning ("`operator=' should return a reference to `*this'");
|
||||
}
|
||||
|
||||
/* The fabled Named Return Value optimization, as per [class.copy]/15:
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2004-07-08 Giovanni Bajo <giovannibajo@gcc.gnu.org>
|
||||
|
||||
PR c++/16169
|
||||
* g++.dg/warn/effc2.C: New test.
|
||||
|
||||
2004-07-08 Joseph S. Myers <jsm@polyomino.org.uk>
|
||||
|
||||
* gcc.c-torture/execute/bitfld-1.x: Remove.
|
||||
|
39
gcc/testsuite/g++.dg/warn/effc2.C
Normal file
39
gcc/testsuite/g++.dg/warn/effc2.C
Normal file
@ -0,0 +1,39 @@
|
||||
// { dg-do compile }
|
||||
// { dg-options "-Weffc++" }
|
||||
// Contributed by Benjamin Kosnik <bkoz at redhat dot com>
|
||||
// PR c++/16169 : Improve -Weffc++ rule 15
|
||||
|
||||
struct A {
|
||||
const A& foo();
|
||||
const A& operator=(int)
|
||||
{ return foo(); }
|
||||
};
|
||||
|
||||
struct B {
|
||||
B& foo();
|
||||
B& operator=(int)
|
||||
{ return foo(); }
|
||||
};
|
||||
|
||||
struct C {
|
||||
C& operator=(int)
|
||||
{ return *this; }
|
||||
};
|
||||
|
||||
struct D {
|
||||
D operator=(int)
|
||||
{ return *this; } // { dg-warning "should return a reference" }
|
||||
};
|
||||
|
||||
struct E {
|
||||
E& foo();
|
||||
E operator=(int)
|
||||
{ return foo(); } // { dg-warning "should return a reference" }
|
||||
};
|
||||
|
||||
struct F
|
||||
{
|
||||
operator float();
|
||||
float operator=(int)
|
||||
{ return *this; } // { dg-warning "should return a reference" }
|
||||
};
|
Loading…
Reference in New Issue
Block a user