aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2014-08-06 21:44:11 -0400
committerJason Merrill <jason@gcc.gnu.org>2014-08-06 21:44:11 -0400
commitced2fb085c43bef21e863989129c54279b7c8e48 (patch)
tree8df901f206f63e19bf29c57e778ffcda9b96c284 /gcc
parent5fb4d142f0554895b6cc03a03f6dcbded483b345 (diff)
downloadgcc-ced2fb085c43bef21e863989129c54279b7c8e48.zip
gcc-ced2fb085c43bef21e863989129c54279b7c8e48.tar.gz
gcc-ced2fb085c43bef21e863989129c54279b7c8e48.tar.bz2
re PR c++/60417 ([DR 1518] Bogus error on C++03 aggregate initialization)
PR c++/60417 * init.c (build_vec_init): Reorganize earlier change a bit. From-SVN: r213689
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog3
-rw-r--r--gcc/cp/init.c40
2 files changed, 23 insertions, 20 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 9ffd746..a373ccf 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,8 @@
2014-08-06 Jason Merrill <jason@redhat.com>
+ PR c++/60417
+ * init.c (build_vec_init): Reorganize earlier change a bit.
+
PR c++/61994
* init.c (build_vec_init): Leave atype an ARRAY_TYPE
if we're just returning an INIT_EXPR.
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 17e6c4b..777e0a9 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -3685,26 +3685,6 @@ build_vec_init (tree base, tree maxindex, tree init,
}
}
- /* If the initializer is {}, then all elements are initialized from T{}.
- But for non-classes, that's the same as value-initialization. */
- if (empty_list)
- {
- if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
- {
- if (BRACE_ENCLOSED_INITIALIZER_P (init)
- && CONSTRUCTOR_NELTS (init) == 0)
- /* Reuse it. */;
- else
- init = build_constructor (init_list_type_node, NULL);
- CONSTRUCTOR_IS_DIRECT_INIT (init) = true;
- }
- else
- {
- init = NULL_TREE;
- explicit_value_init_p = true;
- }
- }
-
/* Now, default-initialize any remaining elements. We don't need to
do that if a) the type does not need constructing, or b) we've
already initialized all the elements.
@@ -3736,6 +3716,26 @@ build_vec_init (tree base, tree maxindex, tree init,
to = build1 (INDIRECT_REF, type, base);
+ /* If the initializer is {}, then all elements are initialized from T{}.
+ But for non-classes, that's the same as value-initialization. */
+ if (empty_list)
+ {
+ if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
+ {
+ if (BRACE_ENCLOSED_INITIALIZER_P (init)
+ && CONSTRUCTOR_NELTS (init) == 0)
+ /* Reuse it. */;
+ else
+ init = build_constructor (init_list_type_node, NULL);
+ CONSTRUCTOR_IS_DIRECT_INIT (init) = true;
+ }
+ else
+ {
+ init = NULL_TREE;
+ explicit_value_init_p = true;
+ }
+ }
+
if (from_array)
{
tree from;