On Wed, Jan 15, 2025 at 04:33:26PM +0100, Jakub Jelinek wrote:
> I vaguely remember from writing the original patch (which introduced
> cp_maybe_split_raw_data) that here it actually mattered whether
> in the error case we move the reshape_iter or not and that it broke
> some tests, but I no longer remember what was it exactly.
> Otherwise it would also just use consume_init like most of the other
> cases.
> I can surely try without that again and see what breaks.
Ah, seems there is not a single testcase which tests has_designator_problem
complaining about the second half of a _Complex.
But, the issue is that the code before my changes was testing it too late:
vec<constructor_elt, va_gc> *v = 0;
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, d->cur->value);
if (has_designator_problem (d, complain))
return error_mark_node;
d->cur++;
and because has_designator_problem looks at d->cur->index, obviously
incrementing d->cur first isn't a good idea.
I'll test if I can go with
if (error_operand_p (d->cur->value)
|| has_designator_problem (d, complain))
return error_mark_node;
vec<constructor_elt, va_gc> *v = 0;
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
init = consume_init (d->cur->value, d);
CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, init);
init = build_constructor (init_list_type_node, v);
which matches how it is done for the first half of the _Complex,
where we do
tree init = d->cur->value;
if (error_operand_p (init))
return error_mark_node;
if (first_initializer_p && !CP_AGGREGATE_TYPE_P (type)
&& has_designator_problem (d, complain))
return error_mark_node;
..
init = consume_init (init, d);
(note, this is inside of first_initializer_p guarded code and type is known
to be COMPLEX_TYPE, so non-aggregate).
Jakub