]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/68983 (ICE: in store_field, at expr.c:6659)
authorJason Merrill <jason@redhat.com>
Fri, 8 Jan 2016 16:02:10 +0000 (11:02 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 8 Jan 2016 16:02:10 +0000 (11:02 -0500)
PR c++/68983

PR c++/67557
* call.c (unsafe_copy_elision_p): Look through COMPOUND_EXPR.

From-SVN: r232171

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/g++.dg/init/elide4.C [new file with mode: 0644]

index 821cee066c8f3b75b0e7595622ccb3fa842c9a33..1b01f4bf1aca4393511c4019b59f51313a867c8a 100644 (file)
@@ -1,3 +1,9 @@
+2016-01-07  Jason Merrill  <jason@redhat.com>
+
+       PR c++/68983
+       PR c++/67557
+       * call.c (unsafe_copy_elision_p): Look through COMPOUND_EXPR.
+
 2015-12-21  Jason Merrill  <jason@redhat.com>
 
        PR c++/66921
index 5c500ef70eb99559db5d7ee4aa86bd1964576489..d2de2abf503f507b94003eb1bf2a0efa425b2f8e 100644 (file)
@@ -6763,6 +6763,9 @@ unsafe_copy_elision_p (tree target, tree exp)
       && resolves_to_fixed_type_p (target, NULL))
     return false;
   tree init = TARGET_EXPR_INITIAL (exp);
+  /* build_compound_expr pushes COMPOUND_EXPR inside TARGET_EXPR.  */
+  while (TREE_CODE (init) == COMPOUND_EXPR)
+    init = TREE_OPERAND (init, 1);
   return (TREE_CODE (init) == AGGR_INIT_EXPR
          && !AGGR_INIT_VIA_CTOR_P (init));
 }
diff --git a/gcc/testsuite/g++.dg/init/elide4.C b/gcc/testsuite/g++.dg/init/elide4.C
new file mode 100644 (file)
index 0000000..f85d6ee
--- /dev/null
@@ -0,0 +1,13 @@
+// PR c++/67557
+
+class A {
+public:
+  A m_fn1();
+  A(A const &);
+  int *L;
+  int ref;
+};
+struct B : A {
+  B();
+};
+B::B() : A((0, m_fn1())) {}