]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR c++/86669 (Complete object constructor clone omits length for a c...
authorJakub Jelinek <jakub@redhat.com>
Fri, 30 Aug 2019 11:20:08 +0000 (13:20 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 30 Aug 2019 11:20:08 +0000 (13:20 +0200)
Backported from mainline
2018-12-07  Jakub Jelinek  <jakub@redhat.com>

PR c++/86669
* call.c (make_temporary_var_for_ref_to_temp): Call pushdecl even for
automatic vars.

* g++.dg/cpp0x/initlist105.C: New test.
* g++.dg/cpp0x/initlist106.C: New test.
* g++.dg/other/pr86669.C: New test.

From-SVN: r275078

gcc/cp/ChangeLog
gcc/cp/call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/initlist105.C [new file with mode: 0644]
gcc/testsuite/g++.dg/cpp0x/initlist106.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/pr86669.C [new file with mode: 0644]

index 64bf90ae6347451cadcc053c5abaf07140b6fe68..92d49aecfdba7fa9afdd33db2ab12da6c01897ce 100644 (file)
@@ -3,6 +3,10 @@
        Backported from mainline
        2018-12-07  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/86669
+       * call.c (make_temporary_var_for_ref_to_temp): Call pushdecl even for
+       automatic vars.
+
        PR c++/87506
        * constexpr.c (adjust_temp_type): Handle EMPTY_CLASS_EXPR.
 
index 5145e438460d2f221ea9e4ef21dbc9ab13d45643..b505e0a8920f9476e2c720e8b33944f2658ec6c9 100644 (file)
@@ -10301,8 +10301,11 @@ make_temporary_var_for_ref_to_temp (tree decl, tree type)
       var = pushdecl_top_level (var);
     }
   else
-    /* Create a new cleanup level if necessary.  */
-    maybe_push_cleanup_level (type);
+    {
+      /* Create a new cleanup level if necessary.  */
+      maybe_push_cleanup_level (type);
+      var = pushdecl (var);
+    }
 
   return var;
 }
index 4797f8c2aca34cbfdc3f41ed2b74496f5c434be8..de812b062a02294562fd9202e66ef29658f4025b 100644 (file)
@@ -3,6 +3,11 @@
        Backported from mainline
        2018-12-07  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/86669
+       * g++.dg/cpp0x/initlist105.C: New test.
+       * g++.dg/cpp0x/initlist106.C: New test.
+       * g++.dg/other/pr86669.C: New test.
+
        PR fortran/88377
        * gfortran.dg/gomp/pr88377.f90: New test.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist105.C b/gcc/testsuite/g++.dg/cpp0x/initlist105.C
new file mode 100644 (file)
index 0000000..3720a2d
--- /dev/null
@@ -0,0 +1,28 @@
+// PR c++/86669
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+struct S { S (); };
+struct T : public S {};
+int cnt;
+void foo (int) { cnt++; }
+
+S::S ()
+{
+  int e = 1, f = 2, g = 3, h = 4;
+
+  for (auto k : { e, f, g, h })
+    foo (k);
+}
+
+int
+main ()
+{
+  S s;
+  if (cnt != 4)
+    __builtin_abort ();
+  T t;
+  if (cnt != 8)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist106.C b/gcc/testsuite/g++.dg/cpp0x/initlist106.C
new file mode 100644 (file)
index 0000000..df0afac
--- /dev/null
@@ -0,0 +1,29 @@
+// PR c++/86669
+// { dg-do run { target c++11 } }
+
+#include <initializer_list>
+
+struct A { };
+struct S : virtual public A { S (); };
+struct T : public S, virtual public A {};
+int cnt;
+void foo (int) { cnt++; }
+
+S::S ()
+{
+  int e = 1, f = 2, g = 3, h = 4;
+
+  for (auto k : { e, f, g, h })
+    foo (k);
+}
+
+int
+main ()
+{
+  S s;
+  if (cnt != 4)
+    __builtin_abort ();
+  T t;
+  if (cnt != 8)
+    __builtin_abort ();
+}
diff --git a/gcc/testsuite/g++.dg/other/pr86669.C b/gcc/testsuite/g++.dg/other/pr86669.C
new file mode 100644 (file)
index 0000000..d986bb1
--- /dev/null
@@ -0,0 +1,10 @@
+// PR c++/86669
+// { dg-do compile }
+
+struct S { S (); };
+struct T : public S {};
+
+S::S ()
+{
+  int *p = { (int *) &p };
+}