diff options
author | Paolo Carlini <paolo.carlini@oracle.com> | 2015-06-09 14:59:08 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2015-06-09 14:59:08 +0000 |
commit | ebcf592c841f47aa38ce0a9d95b4f04af975b0ac (patch) | |
tree | 24ff899bb2363b98e2d5dd7f473d28c8b6cd0906 | |
parent | a0e4b207defe4bb8844f86ebab30aa2ca8de25d1 (diff) | |
download | gcc-ebcf592c841f47aa38ce0a9d95b4f04af975b0ac.zip gcc-ebcf592c841f47aa38ce0a9d95b4f04af975b0ac.tar.gz gcc-ebcf592c841f47aa38ce0a9d95b4f04af975b0ac.tar.bz2 |
re PR c++/65815 (brace elision doesn't work in NSDMI)
/cp
2015-06-09 Paolo Carlini <paolo.carlini@oracle.com>
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 <paolo.carlini@oracle.com>
PR c++/65815
* g++.dg/cpp0x/nsdmi-aggr1.C: New.
* g++.dg/cpp0x/mem-init-aggr1.C: Likewise.
From-SVN: r224286
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 5 | ||||
-rw-r--r-- | gcc/cp/typeck2.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/mem-init-aggr1.C | 10 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/nsdmi-aggr1.C | 10 |
6 files changed, 41 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b71893c..bf48e96 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2015-06-09 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/65815 + * typeck2.c (digest_nsdmi_init): On aggregates use reshape_init. + * init.c (expand_default_init): Likewise. + 2015-06-09 Jason Merrill <jason@redhat.com> PR c++/66383 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index aad3b44..ef4f0ff 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 22a5580..b077f02 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 737dfad..1443d33 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-06-09 Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/65815 + * g++.dg/cpp0x/nsdmi-aggr1.C: New. + * g++.dg/cpp0x/mem-init-aggr1.C: Likewise. + 2015-06-09 Marek Polacek <polacek@redhat.com> 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 0000000..51a2ede --- /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 0000000..e07d392 --- /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 }; +}; |