diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-10-01 11:16:44 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-10-01 11:16:44 +0200 |
commit | 2805fcb32660bc0cdcd5ba54310f1f02651e039f (patch) | |
tree | 365c7a4a2491d674e8847fd175ceda5d9ee7beb3 /gcc/cp | |
parent | 85516b71730d8f9401c34407ac3fadf5f1ebfc4e (diff) | |
download | gcc-2805fcb32660bc0cdcd5ba54310f1f02651e039f.zip gcc-2805fcb32660bc0cdcd5ba54310f1f02651e039f.tar.gz gcc-2805fcb32660bc0cdcd5ba54310f1f02651e039f.tar.bz2 |
c++: Handle std::construct_at on automatic vars during constant evaluation [PR97195]
As mentioned in the PR, we only support due to a bug in constant expressions
std::construct_at on non-automatic variables, because we VERIFY_CONSTANT the
second argument of placement new, which fails verification if it is an
address of an automatic variable.
The following patch fixes it by not performing that verification, the
placement new evaluation later on will verify it after it is dereferenced.
2020-10-01 Jakub Jelinek <jakub@redhat.com>
PR c++/97195
* constexpr.c (cxx_eval_call_expression): Don't VERIFY_CONSTANT the
second argument.
* g++.dg/cpp2a/constexpr-new14.C: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/constexpr.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/gcc/cp/constexpr.c b/gcc/cp/constexpr.c index dacce58..a118f8a 100644 --- a/gcc/cp/constexpr.c +++ b/gcc/cp/constexpr.c @@ -2342,9 +2342,10 @@ cxx_eval_call_expression (const constexpr_ctx *ctx, tree t, tree arg = CALL_EXPR_ARG (t, i); arg = cxx_eval_constant_expression (ctx, arg, false, non_constant_p, overflow_p); - VERIFY_CONSTANT (arg); if (i == 1) arg1 = arg; + else + VERIFY_CONSTANT (arg); } gcc_assert (arg1); return arg1; |