2019-08-30 Jakub Jelinek 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. --- gcc/cp/call.c (revision 267701) +++ gcc/cp/call.c (revision 267702) @@ -10301,8 +10301,11 @@ make_temporary_var_for_ref_to_temp (tree 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; } --- gcc/testsuite/g++.dg/cpp0x/initlist105.C (nonexistent) +++ gcc/testsuite/g++.dg/cpp0x/initlist105.C (revision 267702) @@ -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 (); +} --- gcc/testsuite/g++.dg/cpp0x/initlist106.C (nonexistent) +++ gcc/testsuite/g++.dg/cpp0x/initlist106.C (revision 267702) @@ -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 (); +} --- gcc/testsuite/g++.dg/other/pr86669.C (nonexistent) +++ gcc/testsuite/g++.dg/other/pr86669.C (revision 267702) @@ -0,0 +1,10 @@ +// PR c++/86669 +// { dg-do compile } + +struct S { S (); }; +struct T : public S {}; + +S::S () +{ + int *p = { (int *) &p }; +}