aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2025-04-07 11:49:19 -0400
committerJason Merrill <jason@redhat.com>2025-04-07 13:04:34 -0400
commitc7dc9b6f889fa8f9e4ef060c3af107eaf54265c5 (patch)
tree6899780475998ea9a0397d920c611ee843576737
parent3a77a567b1028a28ecbb2f2eadc351d8bd004352 (diff)
downloadgcc-c7dc9b6f889fa8f9e4ef060c3af107eaf54265c5.zip
gcc-c7dc9b6f889fa8f9e4ef060c3af107eaf54265c5.tar.gz
gcc-c7dc9b6f889fa8f9e4ef060c3af107eaf54265c5.tar.bz2
c++: constinit and value-initialization [PR119652]
Value-initialization built an AGGR_INIT_EXPR to set AGGR_INIT_ZERO_FIRST on. Passing that AGGR_INIT_EXPR to maybe_constant_value returned a TARGET_EXPR, which potential_constant_expression_1 mistook for a temporary. We shouldn't add a TARGET_EXPR to the AGGR_INIT_EXPR in this case, just like we already avoid adding it to CONSTRUCTOR or CALL_EXPR. PR c++/119652 gcc/cp/ChangeLog: * constexpr.cc (cxx_eval_outermost_constant_expr): Also don't add a TARGET_EXPR around AGGR_INIT_EXPR. gcc/testsuite/ChangeLog: * g++.dg/cpp2a/constinit20.C: New test.
-rw-r--r--gcc/cp/constexpr.cc3
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/constinit20.C18
2 files changed, 20 insertions, 1 deletions
diff --git a/gcc/cp/constexpr.cc b/gcc/cp/constexpr.cc
index 37ea65c..497f64f 100644
--- a/gcc/cp/constexpr.cc
+++ b/gcc/cp/constexpr.cc
@@ -9316,7 +9316,8 @@ cxx_eval_outermost_constant_expr (tree t, bool allow_non_constant,
if (TREE_CODE (t) == TARGET_EXPR
&& TARGET_EXPR_INITIAL (t) == r)
return t;
- else if (TREE_CODE (t) == CONSTRUCTOR || TREE_CODE (t) == CALL_EXPR)
+ else if (TREE_CODE (t) == CONSTRUCTOR || TREE_CODE (t) == CALL_EXPR
+ || TREE_CODE (t) == AGGR_INIT_EXPR)
/* Don't add a TARGET_EXPR if our argument didn't have one. */;
else if (TREE_CODE (t) == TARGET_EXPR && TARGET_EXPR_CLEANUP (t))
r = get_target_expr (r);
diff --git a/gcc/testsuite/g++.dg/cpp2a/constinit20.C b/gcc/testsuite/g++.dg/cpp2a/constinit20.C
new file mode 100644
index 0000000..9b04391
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/constinit20.C
@@ -0,0 +1,18 @@
+// PR c++/119652
+// { dg-do compile { target c++20 } }
+
+struct __shared_count {
+ constexpr __shared_count() {}
+ ~__shared_count();
+ int _M_pi = 0;
+};
+struct shared_ptr {
+ __shared_count _M_refcount;
+};
+struct A {
+ A() = default;
+ shared_ptr m;
+};
+constinit A a;
+constinit A b {};
+constinit A c = {};