From 4794d4b5fe27bd40d4fa11ce8319143cf4d259c2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 25 Apr 2013 12:24:33 -0400 Subject: [PATCH] re PR c++/50261 ([C++0x] ICE on brace-initialize an array member) PR c++/50261 * init.c (perform_member_init): Call reshape_init. From-SVN: r198309 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/init.c | 7 ++++++- gcc/testsuite/g++.dg/cpp0x/initlist69.C | 29 +++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist69.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 770f24a..a1471dd 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2013-04-25 Jason Merrill + + PR c++/50261 + * init.c (perform_member_init): Call reshape_init. + 2013-04-24 Jason Merrill PR c++/53721 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 28e2555..3587b08 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -634,7 +634,12 @@ perform_member_init (tree member, tree init) init = build_x_compound_expr_from_list (init, ELK_MEM_INIT, tf_warning_or_error); if (TREE_TYPE (init) != type) - init = digest_init (type, init, tf_warning_or_error); + { + if (BRACE_ENCLOSED_INITIALIZER_P (init) + && CP_AGGREGATE_TYPE_P (type)) + init = reshape_init (type, init, tf_warning_or_error); + init = digest_init (type, init, tf_warning_or_error); + } if (init == error_mark_node) return; /* A FIELD_DECL doesn't really have a suitable lifetime, but diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist69.C b/gcc/testsuite/g++.dg/cpp0x/initlist69.C new file mode 100644 index 0000000..5d59dfe --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist69.C @@ -0,0 +1,29 @@ +// PR c++/50261 +// { dg-require-effective-target c++11 } + +template +struct ca { + T elem[1]; + + ca(const T (&s)[1]): elem{{s}} { } // { dg-error "braces" } + ca(const T (&s)[1],int): elem({{s}}) { } // { dg-error "paren|invalid" } + ca(const T (&s)[1],char): elem(s) { } // { dg-error "array" } + ca(const T (&s)[1],double): elem{s} { } // { dg-error "invalid" } + + ca(const T &v): elem{{v}} { } // { dg-error "braces" } + ca(const T &v,int): elem{{{v}}} { } // { dg-error "braces" } + ca(const T &v,char): elem{v} { } // OK + ca(const T &v,double): elem({v}) { } // { dg-error "paren" } +}; + +int main() { + int a[1] = {0}; + ca d(a); + ca d1(a,1); + ca d2(a,'2'); + ca d3(a,3.0); + ca e(a[0]); + ca e1(a[0],1); + ca e2(a[0],'2'); + ca e3(a[0],3.0); +} -- 2.7.4