c++: -Wdangling-reference not suppressed in template [PR109774]
In check_return_expr, we suppress the -Wdangling-reference warning when we're sure it would be a false positive. It wasn't working in a template, though, because the suppress_warning call was never reached. PR c++/109774 gcc/cp/ChangeLog: * typeck.cc (check_return_expr): In a template, return only after suppressing -Wdangling-reference. gcc/testsuite/ChangeLog: * g++.dg/warn/Wdangling-reference13.C: New test.
This commit is contained in:
parent
94a311abf7
commit
f25d2de176
2 changed files with 26 additions and 3 deletions
|
@ -11236,9 +11236,6 @@ check_return_expr (tree retval, bool *no_warning)
|
|||
build_zero_cst (TREE_TYPE (retval)));
|
||||
}
|
||||
|
||||
if (processing_template_decl)
|
||||
return saved_retval;
|
||||
|
||||
/* A naive attempt to reduce the number of -Wdangling-reference false
|
||||
positives: if we know that this function can return a variable with
|
||||
static storage duration rather than one of its parameters, suppress
|
||||
|
@ -11250,6 +11247,9 @@ check_return_expr (tree retval, bool *no_warning)
|
|||
&& TREE_STATIC (bare_retval))
|
||||
suppress_warning (current_function_decl, OPT_Wdangling_reference);
|
||||
|
||||
if (processing_template_decl)
|
||||
return saved_retval;
|
||||
|
||||
/* Actually copy the value returned into the appropriate location. */
|
||||
if (retval && retval != result)
|
||||
{
|
||||
|
|
23
gcc/testsuite/g++.dg/warn/Wdangling-reference13.C
Normal file
23
gcc/testsuite/g++.dg/warn/Wdangling-reference13.C
Normal file
|
@ -0,0 +1,23 @@
|
|||
// PR c++/109774
|
||||
// { dg-do compile }
|
||||
// { dg-options "-Wdangling-reference" }
|
||||
|
||||
int y;
|
||||
|
||||
template<typename T>
|
||||
int& get(const char& )
|
||||
{
|
||||
return y;
|
||||
}
|
||||
|
||||
int& get2(const char&)
|
||||
{
|
||||
return y;
|
||||
}
|
||||
|
||||
int stuff(void)
|
||||
{
|
||||
const int &h = get<void>(0); // { dg-bogus "dangling reference" }
|
||||
const int &k = get2(0); // { dg-bogus "dangling reference" }
|
||||
return h+k;
|
||||
}
|
Loading…
Add table
Reference in a new issue