Skip to content

Commit 630fb2a

Browse files
authored
cgen: fix generic struct no_key init (#17059)
1 parent 1c6195c commit 630fb2a

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

vlib/v/gen/c/struct.v

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,14 @@ fn (mut g Gen) struct_init(node ast.StructInit) {
8686
if !field.typ.has_flag(.shared_f) {
8787
g.is_shared = false
8888
}
89-
inited_fields[field.name] = i
89+
mut field_name := field.name
90+
if node.no_keys && sym.kind == .struct_ {
91+
info := sym.info as ast.Struct
92+
if info.fields.len == node.fields.len {
93+
field_name = info.fields[i].name
94+
}
95+
}
96+
inited_fields[field_name] = i
9097
if sym.kind != .struct_ {
9198
if field.typ == 0 {
9299
g.checker_bug('struct init, field.typ is 0', field.pos)
@@ -205,6 +212,12 @@ fn (mut g Gen) struct_init(node ast.StructInit) {
205212
sfield.expected_type = tt
206213
}
207214
}
215+
if node.no_keys && sym.kind == .struct_ {
216+
sym_info := sym.info as ast.Struct
217+
if sym_info.fields.len == node.fields.len {
218+
sfield.name = sym_info.fields[already_initalised_node_field_index].name
219+
}
220+
}
208221
g.struct_init_field(sfield, sym.language)
209222
if is_multiline {
210223
g.writeln(',')
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
struct Am {
2+
inner int
3+
}
4+
5+
fn convert[T](num int) T {
6+
return T{num}
7+
}
8+
9+
fn test_generic_struct_no_key_init() {
10+
println(convert[Am](3).inner)
11+
assert convert[Am](3).inner == 3
12+
}

0 commit comments

Comments
 (0)