v.parser: add check for existing type on sum type declaration (#11054)
parent
310b51c883
commit
f59119485a
|
@ -3123,6 +3123,7 @@ fn (mut p Parser) type_decl() ast.TypeDecl {
|
|||
p.check(.key_type)
|
||||
end_pos := p.tok.position()
|
||||
decl_pos := start_pos.extend(end_pos)
|
||||
name_pos := p.tok.position()
|
||||
name := p.check_name()
|
||||
if name.len == 1 && name[0].is_capital() {
|
||||
p.error_with_pos('single letter capital names are reserved for generic template types.',
|
||||
|
@ -3197,6 +3198,11 @@ fn (mut p Parser) type_decl() ast.TypeDecl {
|
|||
}
|
||||
is_public: is_pub
|
||||
})
|
||||
if typ == -1 {
|
||||
p.error_with_pos('cannot register sum type `$name`, another type with this name exists',
|
||||
name_pos)
|
||||
return ast.SumTypeDecl{}
|
||||
}
|
||||
comments = p.eat_comments(same_line: true)
|
||||
return ast.SumTypeDecl{
|
||||
name: name
|
||||
|
@ -3233,7 +3239,7 @@ fn (mut p Parser) type_decl() ast.TypeDecl {
|
|||
type_end_pos := p.prev_tok.position()
|
||||
if idx == -1 {
|
||||
p.error_with_pos('cannot register alias `$name`, another type with this name exists',
|
||||
decl_pos.extend(type_alias_pos))
|
||||
name_pos)
|
||||
return ast.AliasTypeDecl{}
|
||||
}
|
||||
if idx == pidx {
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
vlib/v/parser/tests/sum_type_exists_err.vv:1:6: error: cannot register sum type `Option`, another type with this name exists
|
||||
1 | type Option = string | int
|
||||
| ~~~~~~
|
|
@ -0,0 +1 @@
|
|||
type Option = string | int
|
|
@ -1,7 +1,7 @@
|
|||
vlib/v/parser/tests/type_alias_existing_type_err.vv:3:1: error: cannot register alias `Foo`, another type with this name exists
|
||||
vlib/v/parser/tests/type_alias_existing_type_err.vv:3:6: error: cannot register alias `Foo`, another type with this name exists
|
||||
1 | struct Foo{}
|
||||
2 |
|
||||
2 |
|
||||
3 | type Foo = Foo
|
||||
| ~~~~~~~~~~~~~~
|
||||
4 |
|
||||
| ~~~
|
||||
4 |
|
||||
5 | fn main() {
|
||||
|
|
Loading…
Reference in New Issue