From bbd0603b412b79e7adf609af473a25174cf84665 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Thu, 10 Nov 2022 07:38:00 +0530 Subject: [PATCH] checker: add check for unknown generic types in type alias decl (#16377) --- vlib/v/checker/checker.v | 10 ++++++++++ .../type_alias_struct_generic_unknown_name_err.out | 7 +++++++ .../type_alias_struct_generic_unknown_name_err.vv | 10 ++++++++++ 3 files changed, 27 insertions(+) create mode 100644 vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.out create mode 100644 vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 7ffa4d2a73..93af147677 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -444,6 +444,16 @@ pub fn (mut c Checker) alias_type_decl(node ast.AliasTypeDecl) { orig_sym := c.table.type_to_str(node.parent_type) c.error('type `$typ_sym.str()` is an alias, use the original alias type `$orig_sym` instead', node.type_pos) + } else if typ_sym.kind == .struct_ { + if mut typ_sym.info is ast.Struct { + // check if the generic param types have been defined + for ct in typ_sym.info.concrete_types { + ct_sym := c.table.sym(ct) + if ct_sym.kind == .placeholder { + c.error('unknown type `$ct_sym.name`', node.type_pos) + } + } + } } } diff --git a/vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.out b/vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.out new file mode 100644 index 0000000000..ef497074e8 --- /dev/null +++ b/vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.vv:7:16: error: unknown type `UnknownType` + 5 | } + 6 | + 7 | type NewType = Foo + | ~~~~~~~~~~~~~~~~ + 8 | + 9 | fn main() { diff --git a/vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.vv b/vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.vv new file mode 100644 index 0000000000..23d159ad50 --- /dev/null +++ b/vlib/v/checker/tests/type_alias_struct_generic_unknown_name_err.vv @@ -0,0 +1,10 @@ +module main + +struct Foo { + value T +} + +type NewType = Foo + +fn main() { +}