re PR c++/60417 ([DR 1518] Bogus error on C++03 aggregate initialization)
PR c++/60417 * init.c (build_vec_init): Set CONSTRUCTOR_IS_DIRECT_INIT on init-list for trailing elements. * typeck2.c (process_init_constructor_array): Likewise. From-SVN: r213511
This commit is contained in:
parent
f42589ed15
commit
3bc63227d5
4 changed files with 42 additions and 20 deletions
|
@ -1,3 +1,10 @@
|
|||
2014-08-01 Jason Merrill <jason@redhat.com>
|
||||
|
||||
PR c++/60417
|
||||
* init.c (build_vec_init): Set CONSTRUCTOR_IS_DIRECT_INIT on
|
||||
init-list for trailing elements.
|
||||
* typeck2.c (process_init_constructor_array): Likewise.
|
||||
|
||||
2014-08-01 Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
DR 217 again
|
||||
|
|
|
@ -3545,19 +3545,11 @@ build_vec_init (tree base, tree maxindex, tree init,
|
|||
try_block = begin_try_block ();
|
||||
}
|
||||
|
||||
/* If the initializer is {}, then all elements are initialized from {}.
|
||||
But for non-classes, that's the same as value-initialization. */
|
||||
bool empty_list = false;
|
||||
if (init && BRACE_ENCLOSED_INITIALIZER_P (init)
|
||||
&& CONSTRUCTOR_NELTS (init) == 0)
|
||||
{
|
||||
if (CLASS_TYPE_P (type))
|
||||
/* Leave init alone. */;
|
||||
else
|
||||
{
|
||||
init = NULL_TREE;
|
||||
explicit_value_init_p = true;
|
||||
}
|
||||
}
|
||||
/* Skip over the handling of non-empty init lists. */
|
||||
empty_list = true;
|
||||
|
||||
/* Maybe pull out constant value when from_array? */
|
||||
|
||||
|
@ -3677,14 +3669,8 @@ build_vec_init (tree base, tree maxindex, tree init,
|
|||
vec_free (new_vec);
|
||||
}
|
||||
|
||||
/* Any elements without explicit initializers get {}. */
|
||||
if (cxx_dialect >= cxx11 && AGGREGATE_TYPE_P (type))
|
||||
init = build_constructor (init_list_type_node, NULL);
|
||||
else
|
||||
{
|
||||
init = NULL_TREE;
|
||||
explicit_value_init_p = true;
|
||||
}
|
||||
/* Any elements without explicit initializers get T{}. */
|
||||
empty_list = true;
|
||||
}
|
||||
else if (from_array)
|
||||
{
|
||||
|
@ -3699,6 +3685,26 @@ 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.
|
||||
|
|
|
@ -1239,8 +1239,9 @@ process_init_constructor_array (tree type, tree init,
|
|||
{
|
||||
/* If this type needs constructors run for default-initialization,
|
||||
we can't rely on the back end to do it for us, so make the
|
||||
initialization explicit by list-initializing from {}. */
|
||||
initialization explicit by list-initializing from T{}. */
|
||||
next = build_constructor (init_list_type_node, NULL);
|
||||
CONSTRUCTOR_IS_DIRECT_INIT (next) = true;
|
||||
next = massage_init_elt (TREE_TYPE (type), next, complain);
|
||||
if (initializer_zerop (next))
|
||||
/* The default zero-initialization is fine for us; don't
|
||||
|
|
8
gcc/testsuite/g++.dg/init/explicit2.C
Normal file
8
gcc/testsuite/g++.dg/init/explicit2.C
Normal file
|
@ -0,0 +1,8 @@
|
|||
// PR c++/60417
|
||||
|
||||
struct A { explicit A(int = 0); };
|
||||
|
||||
int main()
|
||||
{
|
||||
A a[1] = { };
|
||||
}
|
Loading…
Add table
Reference in a new issue