From ced2fb085c43bef21e863989129c54279b7c8e48 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 6 Aug 2014 21:44:11 -0400 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 3 +++ gcc/cp/init.c | 40 ++++++++++++++++++++-------------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 9ffd7468563..a373ccfe95c 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2014-08-06 Jason Merrill + 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 17e6c4becb5..777e0a984e4 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;