c++: -Wunused, constant, and generic lambda [PR96311]

We never called mark_use for a return value in a function with dependent
return type.  In that situation we don't know if the use is as an rvalue or
lvalue, but we can use mark_exp_read instead.

gcc/cp/ChangeLog:

	PR c++/96311
	* typeck.c (check_return_expr): Call mark_exp_read in dependent
	case.

gcc/testsuite/ChangeLog:

	PR c++/96311
	* g++.dg/cpp1y/lambda-generic-Wunused.C: New test.
This commit is contained in:
Jason Merrill 2021-04-05 16:22:51 -04:00
parent 07f56824fd
commit b07dd9b0d0
2 changed files with 21 additions and 0 deletions

View File

@ -10215,6 +10215,9 @@ check_return_expr (tree retval, bool *no_warning)
dependent:
/* We should not have changed the return value. */
gcc_assert (retval == saved_retval);
/* We don't know if this is an lvalue or rvalue use, but
either way we can mark it as read. */
mark_exp_read (retval);
return retval;
}

View File

@ -0,0 +1,18 @@
// PR c++/96311
// { dg-do compile { target c++14 } }
// { dg-additional-options -Wunused }
auto foo()
{
constexpr int used = 0;
return
[](auto unused)
{
return used;
};
}
int main()
{
foo()(42);
}