structs/struct_only.vala \
structs/struct-base-types.vala \
structs/struct-empty-still.test \
+ structs/struct-initializer-list-in-array.vala \
structs/struct-no-gtype.vala \
structs/struct-no-gtype-inherit.vala \
structs/struct-static-field-initializer.vala \
--- /dev/null
+struct Foo {
+ public string s;
+ public Bar b;
+ public bool[] ba;
+ public int i;
+}
+
+struct Bar {
+ public string s;
+ public int i;
+}
+
+void main () {
+ Foo[] foos = {
+ { "foo", { "foo", 42 }, { true }, 23 },
+ { "bar", { "bar", 4711 }, { false }, 42 },
+ };
+
+ var f = foos[0];
+ assert (f.i == 23 && f.s == "foo" && f.b.s == "foo" && f.ba[0]);
+
+ f = foos[1];
+ assert (f.i == 42 && f.s == "bar" && f.b.i == 4711 && !f.ba[0]);
+}
st = st.base_struct;
}
+ var in_array_creation_initializer = parent_node is InitializerList && parent_node.parent_node is ArrayCreationExpression;
+ ObjectCreationExpression? struct_creation = null;
+ if (in_array_creation_initializer) {
+ var ma = new MemberAccess.simple (st.name, source_reference);
+ ma.creation_member = true;
+ ma.symbol_reference = st;
+ struct_creation = new ObjectCreationExpression (ma, source_reference);
+ struct_creation.target_type = target_type.copy ();
+ struct_creation.struct_creation = true;
+ }
+
var field_it = st.get_fields ().iterator ();
foreach (Expression e in get_initializers ()) {
Field field = null;
}
}
- e.target_type = field.variable_type.copy ();
- if (!target_type.value_owned) {
- e.target_type.value_owned = false;
+ if (in_array_creation_initializer) {
+ var member_init = new MemberInitializer (field.name, e, e.source_reference);
+ struct_creation.add_member_initializer (member_init);
+ } else {
+ e.target_type = field.variable_type.copy ();
+ if (!target_type.value_owned) {
+ e.target_type.value_owned = false;
+ }
}
}
+
+ if (in_array_creation_initializer) {
+ parent_node.replace_expression (this, struct_creation);
+ checked = false;
+ return struct_creation.check (context);
+ }
} else {
error = true;
Report.error (source_reference, "initializer list used for `%s', which is neither array nor struct".printf (target_type.to_string ()));