diff --git a/vlib/v/checker/struct.v b/vlib/v/checker/struct.v index fba2e02e2e..670ee0de9d 100644 --- a/vlib/v/checker/struct.v +++ b/vlib/v/checker/struct.v @@ -387,6 +387,15 @@ fn (mut c Checker) struct_init(mut node ast.StructInit) ast.Type { field.typ = c.expr(field.expr) field.expected_type = field.typ } + sym := c.table.sym(c.unwrap_generic(node.typ)) + if sym.kind == .struct_ { + info := sym.info as ast.Struct + if node.no_keys && node.fields.len != info.fields.len { + fname := if info.fields.len != 1 { 'fields' } else { 'field' } + c.error('initializing struct `${sym.name}` needs `${info.fields.len}` ${fname}, but got `${node.fields.len}`', + node.pos) + } + } } // string & array are also structs but .kind of string/array .struct_, .string, .array, .alias { diff --git a/vlib/v/checker/tests/generics_struct_nokeys_init_err.out b/vlib/v/checker/tests/generics_struct_nokeys_init_err.out new file mode 100644 index 0000000000..e68cf287cf --- /dev/null +++ b/vlib/v/checker/tests/generics_struct_nokeys_init_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/generics_struct_nokeys_init_err.vv:6:9: error: initializing struct `Am` needs `1` field, but got `2` + 4 | + 5 | fn convert[T](num int) T { + 6 | return T{num, 1} + | ~~~~~~~~~ + 7 | } + 8 | diff --git a/vlib/v/checker/tests/generics_struct_nokeys_init_err.vv b/vlib/v/checker/tests/generics_struct_nokeys_init_err.vv new file mode 100644 index 0000000000..ce2a54d3f9 --- /dev/null +++ b/vlib/v/checker/tests/generics_struct_nokeys_init_err.vv @@ -0,0 +1,12 @@ +struct Am { + inner int +} + +fn convert[T](num int) T { + return T{num, 1} +} + +fn main() { + println(convert[Am](3).inner) + assert convert[Am](3).inner == 3 +}