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:
Marek Polacek 2023-05-16 14:12:06 -04:00
parent 94a311abf7
commit f25d2de176
2 changed files with 26 additions and 3 deletions

View file

@ -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)
{

View 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;
}