aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-03-03 19:55:44 -0500
committerJason Merrill <jason@gcc.gnu.org>2012-03-03 19:55:44 -0500
commit743af85b75560f64ae14845f3889b7b18cba22a7 (patch)
tree8f22a14efe384a57398c117ace7f9749ab014175 /gcc
parentdd94dde78316a27e0028759abbca126fb0fd037f (diff)
downloadgcc-743af85b75560f64ae14845f3889b7b18cba22a7.zip
gcc-743af85b75560f64ae14845f3889b7b18cba22a7.tar.gz
gcc-743af85b75560f64ae14845f3889b7b18cba22a7.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/call.c5
-rw-r--r--gcc/cp/typeck2.c5
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/initlist65.C9
5 files changed, 27 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index df39779..f1eb802 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,11 @@
2012-03-03 Jason Merrill <jason@redhat.com>
+ 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 c962ca0..8baad82 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 a2606f1..974f92f 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 595bc98..6839140 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,8 @@
2012-03-03 Jason Merrill <jason@redhat.com>
+ 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 0000000..3612706
--- /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}; }