From fb8549a1d765f1c8c741c39b9022fefbc09be0de Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Tue, 17 Oct 2006 02:01:27 +0000 Subject: [PATCH] re PR c++/27270 (ICE in process_init_constructor_array, at cp/typeck2.c:788) PR c++/27270 * typeck2.c (process_init_constructor_array): Reword comment. * pt.c (tsubst_copy_and_built): Call reshape_init before calling digest_init. PR c++/27270 * g++.dg/ext/complit8.C: New test. From-SVN: r117814 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 5 ++++- gcc/cp/typeck2.c | 4 ++-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/ext/complit8.C | 12 ++++++++++++ 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/complit8.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ff4718029e3..e603fd5e474 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,10 @@ 2006-10-16 Mark Mitchell + PR c++/27270 + * typeck2.c (process_init_constructor_array): Reword comment. + * pt.c (tsubst_copy_and_built): Call reshape_init before calling + digest_init. + PR c++/29408 * parser.c (cp_parser_using_declaration): Stop parsing when something goes wrong with an access declaration. diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 744871f35a1..ce5a80915f9 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9351,7 +9351,10 @@ tsubst_copy_and_build (tree t, TREE_HAS_CONSTRUCTOR (r) = TREE_HAS_CONSTRUCTOR (t); if (type) - return digest_init (type, r); + { + r = reshape_init (type, r); + return digest_init (type, r); + } return r; } diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index 6d847cb1cf9..725c85fa597 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -791,8 +791,8 @@ process_init_constructor_array (tree type, tree init) /* Vectors are like simple fixed-size arrays. */ len = TYPE_VECTOR_SUBPARTS (type); - /* There cannot be more initializers than needed (or reshape_init would - detect this before we do. */ + /* There cannot be more initializers than needed as otherwise + reshape_init would have already rejected the initializer. */ if (!unbounded) gcc_assert (VEC_length (constructor_elt, v) <= len); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3bf1718e792..603cbedee8a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2006-10-16 Mark Mitchell + PR c++/27270 + * g++.dg/ext/complit8.C: New test. + PR c++/29408 * g++.dg/parse/dtor12.C: New test. diff --git a/gcc/testsuite/g++.dg/ext/complit8.C b/gcc/testsuite/g++.dg/ext/complit8.C new file mode 100644 index 00000000000..b778b4b92b6 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/complit8.C @@ -0,0 +1,12 @@ +// PR c++/27270 +// { dg-options "" } + +template +struct Array { + Entry *array[32]; + Array () : + array ( (Entry*[1]) { 0, 0 } ) // { dg-error "initializers|conversion" } + {} +}; + +Array a;