parser: check error for generic struct parameter (#14362)
parent
cf536b848b
commit
3afc7c4c6d
|
@ -661,11 +661,17 @@ pub fn (mut p Parser) parse_generic_inst_type(name string) ast.Type {
|
||||||
mut concrete_types := []ast.Type{}
|
mut concrete_types := []ast.Type{}
|
||||||
mut is_instance := false
|
mut is_instance := false
|
||||||
for p.tok.kind != .eof {
|
for p.tok.kind != .eof {
|
||||||
|
mut type_pos := p.tok.pos()
|
||||||
gt := p.parse_type()
|
gt := p.parse_type()
|
||||||
|
type_pos = type_pos.extend(p.prev_tok.pos())
|
||||||
if !gt.has_flag(.generic) {
|
if !gt.has_flag(.generic) {
|
||||||
is_instance = true
|
is_instance = true
|
||||||
}
|
}
|
||||||
gts := p.table.sym(gt)
|
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_name += gts.name
|
||||||
bs_cname += gts.cname
|
bs_cname += gts.cname
|
||||||
concrete_types << gt
|
concrete_types << gt
|
||||||
|
|
|
@ -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<T> {
|
||||||
|
9 | mut:
|
||||||
|
10 | lst LinkedList<MyNode<T>>
|
||||||
|
| ~~~~~~~~~
|
||||||
|
11 | }
|
||||||
|
12 |
|
|
@ -0,0 +1,23 @@
|
||||||
|
import datatypes { LinkedList }
|
||||||
|
|
||||||
|
struct MyNode<T> {
|
||||||
|
mut:
|
||||||
|
data T
|
||||||
|
}
|
||||||
|
|
||||||
|
struct MyContainer<T> {
|
||||||
|
mut:
|
||||||
|
lst LinkedList<MyNode<T>>
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut c MyContainer<T>) push(data T) {
|
||||||
|
node := MyNode<T>{
|
||||||
|
data: data
|
||||||
|
}
|
||||||
|
c.lst.push<T>(node)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
mut c := MyContainer<string>{}
|
||||||
|
println(c)
|
||||||
|
}
|
Loading…
Reference in New Issue