2013-07-13 Jason Merrill <jason@redhat.com>
+ PR c++/57402
+ * init.c (build_vec_init): Use {} for arrays of class type.
+ (build_vec_delete): Don't take the address of the array.
+
PR c++/57793
* class.c (layout_class_type): Check for too-large class.
vec_free (new_vec);
}
- /* Clear out INIT so that we don't get confused below. */
- init = NULL_TREE;
/* Any elements without explicit initializers get {}. */
- explicit_value_init_p = true;
+ 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;
+ }
}
else if (from_array)
{
}
else if (TREE_CODE (type) == ARRAY_TYPE)
{
- if (init != 0)
+ if (init && !BRACE_ENCLOSED_INITIALIZER_P (init))
sorry
("cannot initialize multi-dimensional array with initializer");
elt_init = build_vec_init (build1 (INDIRECT_REF, type, base),
- 0, 0,
+ 0, init,
explicit_value_init_p,
0, complain);
}
bad name. */
maxindex = array_type_nelts_total (type);
type = strip_array_types (type);
- base = cp_build_addr_expr (base, complain);
+ base = decay_conversion (base, complain);
if (base == error_mark_node)
return error_mark_node;
if (TREE_SIDE_EFFECTS (base))
--- /dev/null
+// { dg-do run }
+// { dg-require-effective-target c++11 }
+
+struct A
+{
+ int i;
+ A() = default;
+ A(int i): i{i} { }
+ ~A() {}
+};
+
+int main(int argc, char **argv)
+{
+ { int i[4] = { 42, 42, 42, 42 }; }
+ {
+ A a[4] = { argc };
+ if (a[1].i != 0)
+ __builtin_abort ();
+ }
+}
--- /dev/null
+// { dg-do run }
+// { dg-options "-std=c++1y" }
+
+#include <initializer_list>
+
+struct A
+{
+ int i;
+ A(std::initializer_list<int>) { }
+ A(int i): i{i} { }
+ ~A() {}
+};
+
+int x = 4;
+int main(int argc, char **argv)
+{
+ { int i[x] = { 42, 42, 42, 42 }; }
+ {
+ A a[x] = { argc };
+ if (a[1].i != 42)
+ __builtin_abort ();
+ }
+}