c++: Use error_at rather than warning_at for missing return in constexpr functions...
authorJakub Jelinek <jakub@redhat.com>
Fri, 31 Jul 2020 21:08:00 +0000 (23:08 +0200)
committerJakub Jelinek <jakub@redhat.com>
Fri, 31 Jul 2020 21:08:00 +0000 (23:08 +0200)
commit5f9669d9e23a1116e040c80e0f3d4f43639bda52
tree4ec47adc8084756c29bc4247c4a22dbcd46755f7
parent8011f718e241febd6b7a9dae01cde49817f299c4
c++: Use error_at rather than warning_at for missing return in constexpr functions [PR96182]

For C++11 we already emit an error if a constexpr function doesn't contain
a return statement, because in C++11 that is the only thing it needs to
contain, but for C++14 we would normally issue a -Wreturn-type warning.

As mentioned by Jonathan, such constexpr functions are invalid, no
diagnostics required, because there doesn't exist any arguments for
which it would result in valid constant expression.

This raises it to an error in such cases.  The !LAMBDA_TYPE_P case
is to avoid error on g++.dg/pr81194.C where the user didn't write
constexpr anywhere and the operator() is compiler generated.

2020-07-31  Jakub Jelinek  <jakub@redhat.com>

PR c++/96182
* decl.c (finish_function): In constexpr functions use for C++14 and
later error instead of warning if no return statement is present and
diagnose it regardless of warn_return_type.  Move the warn_return_type
diagnostics earlier in the function.

* g++.dg/cpp1y/constexpr-96182.C: New test.
* g++.dg/other/error35.C (S<T>::g()): Add return statement.
* g++.dg/cpp1y/pr63996.C (foo): Likewise.
* g++.dg/cpp1y/constexpr-return2.C (f): Likewise.
* g++.dg/cpp1y/var-templ44.C (make_array): Add throw 1.
gcc/cp/decl.c
gcc/testsuite/g++.dg/cpp1y/constexpr-96182.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp1y/constexpr-return2.C
gcc/testsuite/g++.dg/cpp1y/pr63996.C
gcc/testsuite/g++.dg/cpp1y/var-templ44.C
gcc/testsuite/g++.dg/other/error35.C