]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/86669 (Complete object constructor clone omits length for a c++11 braced...
authorJakub Jelinek <jakub@redhat.com>
Fri, 7 Dec 2018 15:20:04 +0000 (16:20 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 7 Dec 2018 15:20:04 +0000 (16:20 +0100)
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: r266893

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 df8a9d09bd2158e1427165f1f9953d24e33a3397..6481ad4d4dbea1f2d14eb1f033966500062b03c8 100644 (file)
@@ -1,5 +1,9 @@
 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 148e2d5580fc9dcfd3caed281a1ed5ab82ceba80..6328a36b6049dca5c7fdd30888e7b8d947c0494a 100644 (file)
@@ -11148,14 +11148,12 @@ make_temporary_var_for_ref_to_temp (tree decl, tree type)
       tree name = mangle_ref_init_variable (decl);
       DECL_NAME (var) = name;
       SET_DECL_ASSEMBLER_NAME (var, name);
-
-      var = pushdecl (var);
     }
   else
     /* Create a new cleanup level if necessary.  */
     maybe_push_cleanup_level (type);
 
-  return var;
+  return pushdecl (var);
 }
 
 /* EXPR is the initializer for a variable DECL of reference or
index 231275454bd24051280db93eebdf2dd5752dac64..fd940b465b58ef615dd52a3940aeadc50e847fa8 100644 (file)
@@ -1,3 +1,10 @@
+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.
+
 2018-12-07  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.target/aarch64/sve/pred_elim_2.c: 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 };
+}