From ebcf592c841f47aa38ce0a9d95b4f04af975b0ac Mon Sep 17 00:00:00 2001 From: Paolo Carlini Date: Tue, 9 Jun 2015 14:59:08 +0000 Subject: [PATCH] re PR c++/65815 (brace elision doesn't work in NSDMI) /cp 2015-06-09 Paolo Carlini PR c++/65815 * typeck2.c (digest_nsdmi_init): On aggregates use reshape_init. * init.c (expand_default_init): Likewise. /testsuite 2015-06-09 Paolo Carlini PR c++/65815 * g++.dg/cpp0x/nsdmi-aggr1.C: New. * g++.dg/cpp0x/mem-init-aggr1.C: Likewise. From-SVN: r224286 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/init.c | 5 ++++- gcc/cp/typeck2.c | 6 +++++- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/g++.dg/cpp0x/mem-init-aggr1.C | 10 ++++++++++ gcc/testsuite/g++.dg/cpp0x/nsdmi-aggr1.C | 10 ++++++++++ 6 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/mem-init-aggr1.C create mode 100644 gcc/testsuite/g++.dg/cpp0x/nsdmi-aggr1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b71893c2fc6..bf48e969712 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-06-09 Paolo Carlini + + PR c++/65815 + * typeck2.c (digest_nsdmi_init): On aggregates use reshape_init. + * init.c (expand_default_init): Likewise. + 2015-06-09 Jason Merrill PR c++/66383 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index aad3b4409a7..ef4f0ff65d3 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1614,7 +1614,10 @@ expand_default_init (tree binfo, tree true_exp, tree exp, tree init, int flags, && CP_AGGREGATE_TYPE_P (type)) /* A brace-enclosed initializer for an aggregate. In C++0x this can happen for direct-initialization, too. */ - init = digest_init (type, init, complain); + { + init = reshape_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 diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 22a55801601..b077f0273d1 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1158,10 +1158,14 @@ digest_nsdmi_init (tree decl, tree init) { gcc_assert (TREE_CODE (decl) == FIELD_DECL); + tree type = TREE_TYPE (decl); int flags = LOOKUP_IMPLICIT; if (DIRECT_LIST_INIT_P (init)) flags = LOOKUP_NORMAL; - init = digest_init_flags (TREE_TYPE (decl), init, flags); + if (BRACE_ENCLOSED_INITIALIZER_P (init) + && CP_AGGREGATE_TYPE_P (type)) + init = reshape_init (type, init, tf_warning_or_error); + init = digest_init_flags (type, init, flags); if (TREE_CODE (init) == TARGET_EXPR) /* This represents the whole initialization. */ TARGET_EXPR_DIRECT_INIT_P (init) = true; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 737dfad8d8c..1443d33478c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-06-09 Paolo Carlini + + PR c++/65815 + * g++.dg/cpp0x/nsdmi-aggr1.C: New. + * g++.dg/cpp0x/mem-init-aggr1.C: Likewise. + 2015-06-09 Marek Polacek PR tree-optimization/66299 diff --git a/gcc/testsuite/g++.dg/cpp0x/mem-init-aggr1.C b/gcc/testsuite/g++.dg/cpp0x/mem-init-aggr1.C new file mode 100644 index 00000000000..51a2ede310c --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/mem-init-aggr1.C @@ -0,0 +1,10 @@ +// PR c++/65815 +// { dg-do compile { target c++11 } } + +struct array { + int data [2]; +}; + +struct X : array { + X() : array{ 1, 2 } { } +}; diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-aggr1.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-aggr1.C new file mode 100644 index 00000000000..e07d392a664 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-aggr1.C @@ -0,0 +1,10 @@ +// PR c++/65815 +// { dg-do compile { target c++11 } } + +struct array { + int data [2]; +}; + +struct X { + array a = { 1, 2 }; +}; -- 2.30.2