From 473bc0254d9997daa5824e70a8ea4e7642ecbee3 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 10 Apr 2022 02:50:34 +0800 Subject: [PATCH] checker: check error for array of generic struct init (#13987) --- vlib/v/checker/containers.v | 16 ++++++++++++++++ .../tests/array_of_generic_struct_init_err.out | 6 ++++++ .../tests/array_of_generic_struct_init_err.vv | 7 +++++++ 3 files changed, 29 insertions(+) create mode 100644 vlib/v/checker/tests/array_of_generic_struct_init_err.out create mode 100644 vlib/v/checker/tests/array_of_generic_struct_init_err.vv diff --git a/vlib/v/checker/containers.v b/vlib/v/checker/containers.v index 6647998a19..bee64cdb80 100644 --- a/vlib/v/checker/containers.v +++ b/vlib/v/checker/containers.v @@ -9,6 +9,22 @@ pub fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type { mut elem_type := ast.void_type // []string - was set in parser if node.typ != ast.void_type { + if node.elem_type != 0 { + elem_sym := c.table.sym(node.elem_type) + if elem_sym.kind == .struct_ { + elem_info := elem_sym.info as ast.Struct + if elem_info.generic_types.len > 0 && elem_info.concrete_types.len == 0 + && !node.elem_type.has_flag(.generic) { + if c.table.cur_concrete_types.len == 0 { + c.error('generic struct must specify type parameter, e.g. Foo', + node.elem_type_pos) + } else { + c.error('generic struct must specify type parameter, e.g. Foo', + node.elem_type_pos) + } + } + } + } if node.exprs.len == 0 { if node.has_cap { c.check_array_init_para_type('cap', node.cap_expr, node.pos) diff --git a/vlib/v/checker/tests/array_of_generic_struct_init_err.out b/vlib/v/checker/tests/array_of_generic_struct_init_err.out new file mode 100644 index 0000000000..b24df44194 --- /dev/null +++ b/vlib/v/checker/tests/array_of_generic_struct_init_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/array_of_generic_struct_init_err.vv:6:15: error: generic struct must specify type parameter, e.g. Foo + 4 | + 5 | fn main() { + 6 | mut arr := []Item{} + | ~~~~ + 7 | } diff --git a/vlib/v/checker/tests/array_of_generic_struct_init_err.vv b/vlib/v/checker/tests/array_of_generic_struct_init_err.vv new file mode 100644 index 0000000000..4f36203185 --- /dev/null +++ b/vlib/v/checker/tests/array_of_generic_struct_init_err.vv @@ -0,0 +1,7 @@ +struct Item{ + val T +} + +fn main() { + mut arr := []Item{} +}