]> gcc.gnu.org Git - gcc.git/commit
c++: Fix ICE on constexpr placement new [PR115754]
authorJakub Jelinek <jakub@redhat.com>
Tue, 2 Jul 2024 20:09:58 +0000 (22:09 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 2 Jul 2024 20:09:58 +0000 (22:09 +0200)
commit1250540a98e0a1dfa4d7834672d88d8543ea70b1
tree60d3d4a4cc447a31fb3ed4fd9a38caf783c85484
parentbeb7a418aaef2ec8a812712110b007c091a73491
c++: Fix ICE on constexpr placement new [PR115754]

C++26 is making in P2747R2 paper placement new constexpr.
While working on a patch for that, I've noticed we ICE starting with
GCC 14 on the following testcase.
The problem is that e.g. for the void * to sometype * casts checks,
we really assume the casts have their operand constant evaluated
as prvalue, but on the testcase the cast itself is evaluated with
vc_discard and that means op can end up e.g. a VAR_DECL which the
later code doesn't like and asserts on.
If the result type is void, we don't really need the cast operand
for anything, so can use vc_discard for the recursive call,
VIEW_CONVERT_EXPR can appear on the lhs, so we need to honor the
lval but otherwise the patch uses vc_prvalue.
I'd like to get this patch in before the rest of P2747R2 implementation,
so that it can be backported to 14.2 later on.

2024-07-02  Jakub Jelinek  <jakub@redhat.com>
    Jason Merrill  <jason@redhat.com>

PR c++/115754
* constexpr.cc (cxx_eval_constant_expression) <case CONVERT_EXPR>:
For conversions to void, pass vc_discard to the recursive call
and otherwise for tcode other than VIEW_CONVERT_EXPR pass vc_prvalue.

* g++.dg/cpp26/pr115754.C: New test.
gcc/cp/constexpr.cc
gcc/testsuite/g++.dg/cpp26/pr115754.C [new file with mode: 0644]
This page took 0.055621 seconds and 5 git commands to generate.