https://gcc.gnu.org/g:3bd61c1dfaa2d7153eb4be82f423533ea937d0f9

commit r15-7850-g3bd61c1dfaa2d7153eb4be82f423533ea937d0f9
Author: Richard Biener <rguent...@suse.de>
Date:   Thu Mar 6 09:08:07 2025 +0100

    middle-end/119119 - re-gimplification of empty CTOR assignments
    
    The following testcase runs into a re-gimplification issue during
    inlining when processing
    
      MEM[(struct e *)this_2(D)].a = {};
    
    where re-gimplification does not handle assignments in the same
    way than the gimplifier but instead relies on rhs_predicate_for
    and gimplifying the RHS standalone.  This fails to handle
    special-casing of CTORs.  The is_gimple_mem_rhs_or_call predicate
    already handles clobbers but not empty CTORs so we end up in
    the fallback code trying to force the CTOR into a separate stmt
    using a temporary - but as we have a non-copyable type here that ICEs.
    
    The following generalizes empty CTORs in is_gimple_mem_rhs_or_call
    since those need no additional re-gimplification.
    
            PR middle-end/119119
            * gimplify.cc (is_gimple_mem_rhs_or_call): All empty CTORs
            are OK when not a register type.
    
            * g++.dg/torture/pr11911.C: New testcase.

Diff:
---
 gcc/gimplify.cc                        |  2 +-
 gcc/testsuite/g++.dg/torture/pr11911.C | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 160e7fc9df66..6869f53ce701 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -607,7 +607,7 @@ is_gimple_mem_rhs_or_call (tree t)
   else
     return (is_gimple_val (t)
            || is_gimple_lvalue (t)
-           || TREE_CLOBBER_P (t)
+           || (TREE_CODE (t) == CONSTRUCTOR && CONSTRUCTOR_NELTS (t) == 0)
            || TREE_CODE (t) == CALL_EXPR);
 }
 
diff --git a/gcc/testsuite/g++.dg/torture/pr11911.C 
b/gcc/testsuite/g++.dg/torture/pr11911.C
new file mode 100644
index 000000000000..7dc836ff9b53
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr11911.C
@@ -0,0 +1,21 @@
+// { dg-do compile }
+// { dg-require-effective-target c++17 }
+
+struct b {
+  int a;
+};
+struct c {
+  b d{};
+  c() = default;
+  c(c &) = delete;
+};
+struct e {
+  c a{};
+  e() {}
+};
+inline e f() { return {}; }
+struct g {
+  e cx;
+  g() : cx{f()} {}
+};
+void h() { g i; }

Reply via email to