@@ -617,6 +617,7 @@ If you need to modify an array in a function, use a mutable argument instead: `f
617617}
618618
619619fn (mut p Parser) parse_any_type (language ast.Language, is_ptr bool , check_dot bool , is_option bool ) ast.Type {
620+ name_pos := p.tok.pos ()
620621 mut name := p.tok.lit
621622 if language == .c {
622623 name = 'C.${name} '
@@ -779,7 +780,7 @@ fn (mut p Parser) parse_any_type(language ast.Language, is_ptr bool, check_dot b
779780 return p.parse_generic_type (name)
780781 }
781782 if p.tok.kind in [.lt, .lsbr] && p.tok.is_next_to (p.prev_tok) {
782- return p.parse_generic_inst_type (name)
783+ return p.parse_generic_inst_type (name, name_pos )
783784 }
784785 return p.find_type_or_add_placeholder (name, language)
785786 }
@@ -904,7 +905,7 @@ fn (mut p Parser) parse_generic_type(name string) ast.Type {
904905 return ast.new_type (idx).set_flag (.generic)
905906}
906907
907- fn (mut p Parser) parse_generic_inst_type (name string ) ast.Type {
908+ fn (mut p Parser) parse_generic_inst_type (name string , name_pos token.Pos ) ast.Type {
908909 p.generic_type_level++
909910 defer {
910911 p.generic_type_level--
@@ -999,7 +1000,13 @@ fn (mut p Parser) parse_generic_inst_type(name string) ast.Type {
9991000 concrete_types_pos)
10001001 }
10011002 }
1002- else {}
1003+ else {
1004+ // Disallow generic function as type inside struct decl
1005+ if parent_sym.kind == .placeholder && p.inside_struct_field_decl
1006+ && ! parent_sym.name.all_after_last ('.' )[0 ].is_capital () {
1007+ p.error_with_pos ('unknown type `${parent_sym.name} `' , name_pos)
1008+ }
1009+ }
10031010 }
10041011
10051012 idx := p.table.register_sym (ast.TypeSymbol{
0 commit comments