c++: designated init cleanup [PR105925]
build_aggr_conv expects to run after reshape_init, which will usually have filled out all the CONSTRUCTOR indexes; there's no reason to limit using those to the case where the user gave an explicit designator. PR c++/105925 gcc/cp/ChangeLog: * call.cc (build_aggr_conv): Don't depend on CONSTRUCTOR_IS_DESIGNATED_INIT.
This commit is contained in:
parent
d610ae121e
commit
6c72f1bfc3
|
@ -969,7 +969,8 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain)
|
||||||
tree empty_ctor = NULL_TREE;
|
tree empty_ctor = NULL_TREE;
|
||||||
hash_set<tree, true> pset;
|
hash_set<tree, true> pset;
|
||||||
|
|
||||||
/* We already called reshape_init in implicit_conversion. */
|
/* We already called reshape_init in implicit_conversion, but it might not
|
||||||
|
have done anything in the case of parenthesized aggr init. */
|
||||||
|
|
||||||
/* The conversions within the init-list aren't affected by the enclosing
|
/* The conversions within the init-list aren't affected by the enclosing
|
||||||
context; they're always simple copy-initialization. */
|
context; they're always simple copy-initialization. */
|
||||||
|
@ -979,49 +980,48 @@ build_aggr_conv (tree type, tree ctor, int flags, tsubst_flags_t complain)
|
||||||
to corresponding TREE_TYPE (ce->index) and mark those FIELD_DECLs as
|
to corresponding TREE_TYPE (ce->index) and mark those FIELD_DECLs as
|
||||||
visited. In the following loop then ignore already visited
|
visited. In the following loop then ignore already visited
|
||||||
FIELD_DECLs. */
|
FIELD_DECLs. */
|
||||||
if (CONSTRUCTOR_IS_DESIGNATED_INIT (ctor))
|
tree idx, val;
|
||||||
|
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), i, idx, val)
|
||||||
{
|
{
|
||||||
tree idx, val;
|
if (!idx)
|
||||||
FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), i, idx, val)
|
break;
|
||||||
|
|
||||||
|
gcc_checking_assert (TREE_CODE (idx) == FIELD_DECL);
|
||||||
|
|
||||||
|
tree ftype = TREE_TYPE (idx);
|
||||||
|
bool ok;
|
||||||
|
|
||||||
|
if (TREE_CODE (ftype) == ARRAY_TYPE)
|
||||||
|
ok = can_convert_array (ftype, val, flags, complain);
|
||||||
|
else
|
||||||
|
ok = can_convert_arg (ftype, TREE_TYPE (val), val, flags,
|
||||||
|
complain);
|
||||||
|
|
||||||
|
if (!ok)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* For unions, there should be just one initializer. */
|
||||||
|
if (TREE_CODE (type) == UNION_TYPE)
|
||||||
{
|
{
|
||||||
if (idx && TREE_CODE (idx) == FIELD_DECL)
|
field = NULL_TREE;
|
||||||
{
|
i = 1;
|
||||||
tree ftype = TREE_TYPE (idx);
|
break;
|
||||||
bool ok;
|
|
||||||
|
|
||||||
if (TREE_CODE (ftype) == ARRAY_TYPE)
|
|
||||||
ok = can_convert_array (ftype, val, flags, complain);
|
|
||||||
else
|
|
||||||
ok = can_convert_arg (ftype, TREE_TYPE (val), val, flags,
|
|
||||||
complain);
|
|
||||||
|
|
||||||
if (!ok)
|
|
||||||
return NULL;
|
|
||||||
/* For unions, there should be just one initializer. */
|
|
||||||
if (TREE_CODE (type) == UNION_TYPE)
|
|
||||||
{
|
|
||||||
field = NULL_TREE;
|
|
||||||
i = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
pset.add (idx);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
pset.add (idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; field; field = next_aggregate_field (DECL_CHAIN (field)))
|
for (; field; field = next_aggregate_field (DECL_CHAIN (field)))
|
||||||
{
|
{
|
||||||
tree ftype = TREE_TYPE (field);
|
tree ftype = TREE_TYPE (field);
|
||||||
tree val;
|
|
||||||
bool ok;
|
bool ok;
|
||||||
|
|
||||||
if (!pset.is_empty () && field_in_pset (pset, field))
|
if (!pset.is_empty () && field_in_pset (pset, field))
|
||||||
continue;
|
continue;
|
||||||
if (i < CONSTRUCTOR_NELTS (ctor))
|
if (i < CONSTRUCTOR_NELTS (ctor))
|
||||||
{
|
{
|
||||||
val = CONSTRUCTOR_ELT (ctor, i)->value;
|
constructor_elt *ce = CONSTRUCTOR_ELT (ctor, i);
|
||||||
|
gcc_checking_assert (!ce->index);
|
||||||
|
val = ce->value;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
else if (DECL_INITIAL (field))
|
else if (DECL_INITIAL (field))
|
||||||
|
|
Loading…
Reference in New Issue