diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 7ffa4d2a73b1e3..93af14767769b0 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 00000000000000..ef497074e8edd4 --- /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 00000000000000..23d159ad502763 --- /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() { +}