Skip to content

Commit 8ef3db5

Browse files
authored
parser: disallow using generic functions as a field type name inside struct decl (fix #25452) (#25705)
1 parent 33e129b commit 8ef3db5

File tree

3 files changed

+21
-3
lines changed

3 files changed

+21
-3
lines changed

vlib/v/parser/parse_type.v

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,7 @@ If you need to modify an array in a function, use a mutable argument instead: `f
617617
}
618618

619619
fn (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{
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
vlib/v/parser/tests/generic_imp_symbol_struct_field_err.vv:4:8: error: unknown type `math.vec.vec3`
2+
2 |
3+
3 | struct Veca {
4+
4 | field vec3[f64]
5+
| ~~~~
6+
5 | }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import math.vec { vec3 }
2+
3+
struct Veca {
4+
field vec3[f64]
5+
}

0 commit comments

Comments
 (0)