From ef9f382ca52a80bb8575d73d7cc8d3ddbf5f7ad7 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 4 Dec 2014 15:37:30 -0500 Subject: [PATCH] re PR c++/64029 (const int (&in)[]{1,2,3,4,5}; results in internal compiler error: Segmentation fault) PR c++/64029 * decl.c (grok_reference_init): Complete array type. From-SVN: r218402 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/decl.c | 17 ++++++++++++++++- gcc/testsuite/g++.dg/cpp0x/initlist89.C | 4 ++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist89.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 2db8bd7c581..361e634ea5f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-12-03 Jason Merrill + PR c++/64029 + * decl.c (grok_reference_init): Complete array type. + PR c++/64080 * constexpr.c (cxx_eval_store_expression): Handle non-decl store targets. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2996ee68757..5639b3d54c8 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -4936,11 +4936,26 @@ grok_reference_init (tree decl, tree type, tree init, int flags) init = build_x_compound_expr_from_list (init, ELK_INIT, tf_warning_or_error); - if (TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE + tree ttype = TREE_TYPE (type); + if (TREE_CODE (ttype) != ARRAY_TYPE && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE) /* Note: default conversion is only called in very special cases. */ init = decay_conversion (init, tf_warning_or_error); + /* check_initializer handles this for non-reference variables, but for + references we need to do it here or the initializer will get the + incomplete array type and confuse later calls to + cp_complete_array_type. */ + if (TREE_CODE (ttype) == ARRAY_TYPE + && TYPE_DOMAIN (ttype) == NULL_TREE + && (BRACE_ENCLOSED_INITIALIZER_P (init) + || TREE_CODE (init) == STRING_CST)) + { + cp_complete_array_type (&ttype, init, false); + if (ttype != TREE_TYPE (type)) + type = cp_build_reference_type (ttype, TYPE_REF_IS_RVALUE (type)); + } + /* Convert INIT to the reference type TYPE. This may involve the creation of a temporary, whose lifetime must be the same as that of the reference. If so, a DECL_EXPR for the temporary will be diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist89.C b/gcc/testsuite/g++.dg/cpp0x/initlist89.C new file mode 100644 index 00000000000..e221664e30f --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist89.C @@ -0,0 +1,4 @@ +// PR c++/64029 +// { dg-do compile { target c++11 } } + +const int (&in)[]{1,2,3,4,5}; -- 2.30.2