On 6/2/22 16:10, Marek Polacek wrote:
On Thu, Jun 02, 2022 at 03:42:15PM -0400, Jason Merrill wrote:
On 6/2/22 10:03, Marek Polacek wrote:
On Thu, Jun 02, 2022 at 08:42:36AM -0400, Patrick Palka wrote:
On Wed, 1 Jun 2022, Marek Polacek via Gcc-patches wrote:
Here we ICE because value_dependent_expression_p gets a NEW_EXPR
whose operand is a type, and we go to the default case which just
calls v_d_e_p on each operand of the NEW_EXPR. Since one of them
is a type, we crash on the new assert in t_d_e_p.
Looks like NEW_EXPR is considered to be not potentially constant
according to potential_constant_expression. I thought we shouldn't
be calling value_dependent_expression_p on such exprs?
Except in C++20 new-expressions are potentially constant, so the patch is
Thanks, pushed.
OK, and we should adjust pce1 accordingly.
Is the attached patch OK then? So far dg.exp passed. Though it won't help
with...
I notice we currently fail to handle
struct A
{
int i;
constexpr A(int *p): i(*p) { delete p; }
};
constexpr int i = A(new int(42)).i;
though it does work inside a function.
...this test (it complains about a TARGET_EXPR's slot variable not being
declared constexpr), so I'm going to open a PR.
From cf70354894bc31cc542ed8df40633bea2427fee7 Mon Sep 17 00:00:00 2001
From: Marek Polacek <pola...@redhat.com>
Date: Thu, 2 Jun 2022 15:56:18 -0400
Subject: [PATCH] c++: new-expression is potentially constant in C++20
... so adjust p_c_e accordingly.
gcc/cp/ChangeLog:
* constexpr.cc (potential_constant_expression_1): Treat
{,VEC_}NEW_EXPR as potentially constant in C++20.
---
gcc/cp/constexpr.cc | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 1346a1d4c10..2bbd8785627 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -9039,10 +9039,18 @@ potential_constant_expression_1 (tree t, bool
want_rval, bool strict, bool now,
"before C++17");
return false;
- case DYNAMIC_CAST_EXPR:
- case PSEUDO_DTOR_EXPR:
case NEW_EXPR:
case VEC_NEW_EXPR:
+ if (cxx_dialect >= cxx20)
+ /* In C++20, new-expressions are potentially constant. */
+ return true;
+ else if (flags & tf_error)
+ error_at (loc, "new-expression is not a constant expression "
+ "before C++20");
+ return false;
+
+ case DYNAMIC_CAST_EXPR:
+ case PSEUDO_DTOR_EXPR:
case DELETE_EXPR:
case VEC_DELETE_EXPR:
Delete, too.
case THROW_EXPR:
base-commit: 7b98910406b5000a6429c188b0c6cc14e3140637