From 743af85b75560f64ae14845f3889b7b18cba22a7 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Sat, 3 Mar 2012 19:55:44 -0500 Subject: [PATCH] Core 1270 Core 1270 * call.c (build_aggr_conv): Call reshape_init. (convert_like_real): Likewise. * typeck2.c (process_init_constructor): Clear TREE_CONSTANT if not all constant. From-SVN: r184876 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/call.c | 5 +++++ gcc/cp/typeck2.c | 5 ++++- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/cpp0x/initlist65.C | 9 +++++++++ 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist65.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index df39779475c..f1eb802f9c1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2012-03-03 Jason Merrill + Core 1270 + * call.c (build_aggr_conv): Call reshape_init. + (convert_like_real): Likewise. + * typeck2.c (process_init_constructor): Clear TREE_CONSTANT if + not all constant. + * mangle.c (write_nested_name): Use decl_mangling_context. (write_prefix, write_template_prefix): Likewise. diff --git a/gcc/cp/call.c b/gcc/cp/call.c index c962ca0bd53..8baad827f6d 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -886,6 +886,10 @@ build_aggr_conv (tree type, tree ctor, int flags) tree field = next_initializable_field (TYPE_FIELDS (type)); tree empty_ctor = NULL_TREE; + ctor = reshape_init (type, ctor, tf_none); + if (ctor == error_mark_node) + return NULL; + for (; field; field = next_initializable_field (DECL_CHAIN (field))) { tree ftype = TREE_TYPE (field); @@ -5795,6 +5799,7 @@ convert_like_real (conversion *convs, tree expr, tree fn, int argnum, expr = build2 (COMPLEX_EXPR, totype, real, imag); return fold_if_not_in_template (expr); } + expr = reshape_init (totype, expr, complain); return get_target_expr (digest_init (totype, expr, complain)); default: diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c index a2606f17abb..974f92ff89c 100644 --- a/gcc/cp/typeck2.c +++ b/gcc/cp/typeck2.c @@ -1392,7 +1392,10 @@ process_init_constructor (tree type, tree init, tsubst_flags_t complain) TREE_TYPE (init) = type; if (TREE_CODE (type) == ARRAY_TYPE && TYPE_DOMAIN (type) == NULL_TREE) cp_complete_array_type (&TREE_TYPE (init), init, /*do_default=*/0); - if (!(flags & PICFLAG_NOT_ALL_CONSTANT)) + if (flags & PICFLAG_NOT_ALL_CONSTANT) + /* Make sure TREE_CONSTANT isn't set from build_constructor. */ + TREE_CONSTANT (init) = false; + else { TREE_CONSTANT (init) = 1; if (!(flags & PICFLAG_NOT_ALL_SIMPLE)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 595bc982c71..68391401b32 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2012-03-03 Jason Merrill + Core 1270 + * g++.dg/cpp0x/initlist65.C: New. + PR c++/36797 * g++.dg/ext/is_empty2.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist65.C b/gcc/testsuite/g++.dg/cpp0x/initlist65.C new file mode 100644 index 00000000000..36127069d22 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist65.C @@ -0,0 +1,9 @@ +// Core 1270 +// { dg-options -std=c++11 } + +struct A +{ + int i[2]; +}; + +A f() { return {1,2}; } -- 2.30.2