From 3afc7c4c6d230584fd8e4facd7640f55c61e3ced Mon Sep 17 00:00:00 2001 From: yuyi Date: Wed, 11 May 2022 18:24:54 +0800 Subject: [PATCH] parser: check error for generic struct parameter (#14362) --- vlib/v/parser/parse_type.v | 6 +++++ .../tests/generic_struct_parameter_err.out | 7 ++++++ .../tests/generic_struct_parameter_err.vv | 23 +++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 vlib/v/parser/tests/generic_struct_parameter_err.out create mode 100644 vlib/v/parser/tests/generic_struct_parameter_err.vv diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index 5076a67736..dc6f045137 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -661,11 +661,17 @@ pub fn (mut p Parser) parse_generic_inst_type(name string) ast.Type { mut concrete_types := []ast.Type{} mut is_instance := false for p.tok.kind != .eof { + mut type_pos := p.tok.pos() gt := p.parse_type() + type_pos = type_pos.extend(p.prev_tok.pos()) if !gt.has_flag(.generic) { is_instance = true } gts := p.table.sym(gt) + if !is_instance && gts.name.len > 1 { + p.error_with_pos('generic struct parameter name needs to be exactly one char', + type_pos) + } bs_name += gts.name bs_cname += gts.cname concrete_types << gt diff --git a/vlib/v/parser/tests/generic_struct_parameter_err.out b/vlib/v/parser/tests/generic_struct_parameter_err.out new file mode 100644 index 0000000000..dcb4658b3d --- /dev/null +++ b/vlib/v/parser/tests/generic_struct_parameter_err.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/generic_struct_parameter_err.vv:10:17: error: generic struct parameter name needs to be exactly one char + 8 | struct MyContainer { + 9 | mut: + 10 | lst LinkedList> + | ~~~~~~~~~ + 11 | } + 12 | diff --git a/vlib/v/parser/tests/generic_struct_parameter_err.vv b/vlib/v/parser/tests/generic_struct_parameter_err.vv new file mode 100644 index 0000000000..6cdfca6c37 --- /dev/null +++ b/vlib/v/parser/tests/generic_struct_parameter_err.vv @@ -0,0 +1,23 @@ +import datatypes { LinkedList } + +struct MyNode { +mut: + data T +} + +struct MyContainer { +mut: + lst LinkedList> +} + +fn (mut c MyContainer) push(data T) { + node := MyNode{ + data: data + } + c.lst.push(node) +} + +fn main() { + mut c := MyContainer{} + println(c) +}