PR c++/93033 - incorrect tree node sharing with array init.
authorJason Merrill <jason@redhat.com>
Fri, 3 Jan 2020 22:10:56 +0000 (17:10 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 3 Jan 2020 22:10:56 +0000 (17:10 -0500)
The split_nonconstant_init piece is the only one necessary to fix the
testcase, but it occurred to me that we might as well not split when
-fno-exceptions.

* typeck2.c (split_nonconstant_init): Unshare non-decl.
* cp-gimplify.c (cp_gimplify_init_expr): Only split if -fexceptions.

From-SVN: r279871

gcc/cp/ChangeLog
gcc/cp/cp-gimplify.c
gcc/cp/typeck2.c
gcc/testsuite/g++.dg/cpp0x/initlist-array9.C [new file with mode: 0644]

index 9b607b2f0733a7731b46d1da1a28888070933ba0..421048b79d0fced18629b1e57ec7cf46abd710d1 100644 (file)
@@ -1,3 +1,9 @@
+2020-01-03  Jason Merrill  <jason@redhat.com>
+
+       PR c++/93033 - incorrect tree node sharing with array init.
+       * typeck2.c (split_nonconstant_init): Unshare non-decl.
+       * cp-gimplify.c (cp_gimplify_init_expr): Only split if -fexceptions.
+
 2020-01-02  Jason Merrill  <jason@redhat.com>
 
        * pt.c (invalid_nontype_parm_type_p): Reject class placeholder in
index 3eca3591e01e6b19f1b9aca81ec65d0ceabc3679..eb552767f61bb7ed535ef86c84d7d0d4e945d216 100644 (file)
@@ -529,6 +529,7 @@ cp_gimplify_init_expr (tree *expr_p, gimple_seq *pre_p)
   /* If we might need to clean up a partially constructed object, break down
      the CONSTRUCTOR with split_nonconstant_init.  */
   if (TREE_CODE (from) == CONSTRUCTOR
+      && flag_exceptions
       && TREE_SIDE_EFFECTS (from)
       && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (to)))
     {
index f36a5649ae65b63c53be034635bdcc2fa9e535c9..955669727c354bca56c6457388788c312f7427cc 100644 (file)
@@ -34,6 +34,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "intl.h"
 #include "gcc-rich-location.h"
 #include "target.h"
+#include "gimplify.h"
 
 static tree
 process_init_constructor (tree type, tree init, int nested, int flags,
@@ -791,7 +792,8 @@ split_nonconstant_init (tree dest, tree init)
        }
       else if (init)
        {
-         tree ie = build2 (INIT_EXPR, void_type_node, dest, init);
+         tree ie = build2 (INIT_EXPR, void_type_node,
+                           unshare_expr (dest), init);
          code = add_stmt_to_compound (ie, code);
        }
     }
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist-array9.C b/gcc/testsuite/g++.dg/cpp0x/initlist-array9.C
new file mode 100644 (file)
index 0000000..4a5d74f
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/93033
+// { dg-do compile { target c++11 } }
+
+struct A {
+  A ();
+  ~A ();
+};
+
+A f();
+
+struct B {
+  A a;
+  bool b;
+};
+
+void
+foo ()
+{
+  B i[] { f() };
+}