+2009-01-02 Jason Merrill <jason@redhat.com>
+
+ PR c++/38698
+ * typeck2.c (process_init_constructor_union): Handle excess
+ initializers.
+ (process_init_constructor_record): Likewise.
+
+ PR c++/38684
+ * typeck2.c (digest_init_r): Don't use process_init_constructor
+ for non-aggregate classes.
+
2008-12-31 Jakub Jelinek <jakub@redhat.com>
PR c++/38647
|| TREE_CODE (type) == UNION_TYPE
|| TREE_CODE (type) == COMPLEX_TYPE);
- if (BRACE_ENCLOSED_INITIALIZER_P (init))
+ if (BRACE_ENCLOSED_INITIALIZER_P (init)
+ && !TYPE_NON_AGGREGATE_CLASS (type))
return process_init_constructor (type, init);
else
{
CONSTRUCTOR_APPEND_ELT (v, field, next);
}
+ if (idx < VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init)))
+ error ("too many initializers for %qT", type);
+
CONSTRUCTOR_ELTS (init) = v;
return flags;
}
process_init_constructor_union (tree type, tree init)
{
constructor_elt *ce;
+ int len;
/* If the initializer was empty, use default zero initialization. */
if (VEC_empty (constructor_elt, CONSTRUCTOR_ELTS (init)))
return 0;
- gcc_assert (VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init)) == 1);
+ len = VEC_length (constructor_elt, CONSTRUCTOR_ELTS (init));
+ if (len > 1)
+ {
+ error ("too many initializers for %qT", type);
+ VEC_block_remove (constructor_elt, CONSTRUCTOR_ELTS (init), 1, len-1);
+ }
+
ce = VEC_index (constructor_elt, CONSTRUCTOR_ELTS (init), 0);
/* If this element specifies a field, initialize via that field. */
+2009-01-02 Jason Merrill <jason@redhat.com>
+
+ * g++.dg/cpp0x/initlist11.C: New test.
+ * g++.dg/cpp0x/initlist12.C: New test.
+
2009-01-02 Richard Sandiford <rdsandiford@googlemail.com>
* gcc.dg/fixed-point/composite-type.c: Update wording of messages.