diff --git a/vlib/v/gen/c/struct.v b/vlib/v/gen/c/struct.v index 8838c6609d..a3b0972b9c 100644 --- a/vlib/v/gen/c/struct.v +++ b/vlib/v/gen/c/struct.v @@ -86,7 +86,14 @@ fn (mut g Gen) struct_init(node ast.StructInit) { if !field.typ.has_flag(.shared_f) { g.is_shared = false } - inited_fields[field.name] = i + mut field_name := field.name + if node.no_keys && sym.kind == .struct_ { + info := sym.info as ast.Struct + if info.fields.len == node.fields.len { + field_name = info.fields[i].name + } + } + inited_fields[field_name] = i if sym.kind != .struct_ { if field.typ == 0 { g.checker_bug('struct init, field.typ is 0', field.pos) @@ -205,6 +212,12 @@ fn (mut g Gen) struct_init(node ast.StructInit) { sfield.expected_type = tt } } + if node.no_keys && sym.kind == .struct_ { + sym_info := sym.info as ast.Struct + if sym_info.fields.len == node.fields.len { + sfield.name = sym_info.fields[already_initalised_node_field_index].name + } + } g.struct_init_field(sfield, sym.language) if is_multiline { g.writeln(',') diff --git a/vlib/v/tests/generics_struct_no_key_init_test.v b/vlib/v/tests/generics_struct_no_key_init_test.v new file mode 100644 index 0000000000..2468136545 --- /dev/null +++ b/vlib/v/tests/generics_struct_no_key_init_test.v @@ -0,0 +1,12 @@ +struct Am { + inner int +} + +fn convert[T](num int) T { + return T{num} +} + +fn test_generic_struct_no_key_init() { + println(convert[Am](3).inner) + assert convert[Am](3).inner == 3 +}