diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-12-04 20:37:30 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-12-04 20:37:30 +0000 |
commit | e2971c54d58d98b11b49fccfc7343e6acff97195 (patch) | |
tree | 49c4e37adfdcdda395e897cca82fb1cbe690ac32 | |
parent | 6fe83e54b813fd448f3b69676821a090b2918420 (diff) | |
download | gcc-e2971c54d58d98b11b49fccfc7343e6acff97195.tar.gz |
PR c++/64029
* decl.c (grok_reference_init): Complete array type.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218402 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/cp/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/cp/decl.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist89.C | 4 |
3 files changed, 23 insertions, 1 deletions
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 <jason@redhat.com> + 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}; |