c++: Fix constexpr cleanup error handling.
authorJason Merrill <jason@redhat.com>
Wed, 28 Oct 2020 21:30:05 +0000 (17:30 -0400)
committerJason Merrill <jason@redhat.com>
Thu, 29 Oct 2020 17:09:19 +0000 (13:09 -0400)
commit8895443a42db4045aad8e4b42cd5dd2ad6ffa7d7
tree86d08ca2e07ec9650266b97e5c53b6eea03c3511
parent5afd90c5f36bf45291ca09ef3791f4a574e90d5d
c++: Fix constexpr cleanup error handling.

In this testcase, the primary evaluation successfully produces 'true', and
then running one of the cleanups hits a double delete, making the whole
thing not a valid constant expression.  So we were returning 'true' wrapped
in a NOP_EXPR to indicate its non-constancy, but evaluating that again is a
perfectly acceptable constant expression, so we weren't getting the verbose
diagnostic we were looking for.

So if non_constant_p gets set other than for overflow, go back to the
original expression.

With this change, we should never hit the manifestly_const_eval test, and
the is-constant-evaluated1.C test passes without it.

gcc/cp/ChangeLog:

PR c++/97388
* constexpr.c (cxx_eval_outermost_constant_expr): Revert to
original expression if evaluation sets non_constant_p.

gcc/testsuite/ChangeLog:

PR c++/97388
* g++.dg/cpp2a/constexpr-dtor8.C: New test.
gcc/cp/constexpr.c
gcc/testsuite/g++.dg/cpp2a/constexpr-dtor8.C [new file with mode: 0644]