From: Jakub Jelinek Date: Fri, 30 Aug 2019 11:20:08 +0000 (+0200) Subject: backport: re PR c++/86669 (Complete object constructor clone omits length for a c... X-Git-Tag: releases/gcc-7.5.0~283 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=67747d8355aa30d932bb5b432c0d48d8282bb69b;p=thirdparty%2Fgcc.git backport: re PR c++/86669 (Complete object constructor clone omits length for a c++11 braced initialiser) Backported from mainline 2018-12-07 Jakub Jelinek 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 64bf90ae6347..92d49aecfdba 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -3,6 +3,10 @@ Backported from mainline 2018-12-07 Jakub Jelinek + 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. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index 5145e438460d..b505e0a8920f 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4797f8c2aca3..de812b062a02 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,11 @@ Backported from mainline 2018-12-07 Jakub Jelinek + 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 index 000000000000..3720a2da83c4 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist105.C @@ -0,0 +1,28 @@ +// PR c++/86669 +// { dg-do run { target c++11 } } + +#include + +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 index 000000000000..df0afac8088d --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist106.C @@ -0,0 +1,29 @@ +// PR c++/86669 +// { dg-do run { target c++11 } } + +#include + +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 index 000000000000..d986bb1966b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/pr86669.C @@ -0,0 +1,10 @@ +// PR c++/86669 +// { dg-do compile } + +struct S { S (); }; +struct T : public S {}; + +S::S () +{ + int *p = { (int *) &p }; +}