2016-02-04 Jakub Jelinek PR c++/69658 * init.c (expand_default_init): Only call reshape_init in the direct-initialization from an initializer list case. * g++.dg/init/pr69658.C: New test. --- gcc/cp/init.c.jj 2016-01-29 12:12:46.000000000 +0100 +++ gcc/cp/init.c 2016-02-04 18:53:26.865318337 +0100 @@ -1636,16 +1636,17 @@ expand_default_init (tree binfo, tree tr gcc_checking_assert ((flags & LOOKUP_ONLYCONVERTING) == 0 && TREE_CHAIN (init) == NULL_TREE); init = TREE_VALUE (init); + /* Only call reshape_init if it has not been called earlier + by the callers. */ + if (BRACE_ENCLOSED_INITIALIZER_P (init) && CP_AGGREGATE_TYPE_P (type)) + init = reshape_init (type, init, complain); } if (init && BRACE_ENCLOSED_INITIALIZER_P (init) && CP_AGGREGATE_TYPE_P (type)) /* A brace-enclosed initializer for an aggregate. In C++0x this can happen for direct-initialization, too. */ - { - init = reshape_init (type, init, complain); - init = digest_init (type, init, complain); - } + init = digest_init (type, init, complain); /* A CONSTRUCTOR of the target's type is a previously digested initializer, whether that happened just above or in --- gcc/testsuite/g++.dg/init/pr69658.C.jj 2016-02-04 18:55:46.862390961 +0100 +++ gcc/testsuite/g++.dg/init/pr69658.C 2016-02-04 18:54:58.000000000 +0100 @@ -0,0 +1,6 @@ +// PR c++/69658 +// { dg-do compile } + +struct S { S (int); }; +struct T { char n[6]; S s; }; +T t[1] = { { "foo", 1 } }; // { dg-bogus "C99 designator" }