diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index b88d15b479..11d1b416ed 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -10,6 +10,11 @@ import v.util import v.pref import sync.stdatomic +// V type names that cannot be used as global var name +pub const global_reserved_type_names = ['byte', 'bool', 'char', 'i8', 'i16', 'int', 'i64', 'u8', + 'u16', 'u32', 'u64', 'f32', 'f64', 'map', 'string', 'rune', 'usize', 'isize', 'voidptr', 'thread', + 'array'] + pub type TypeDecl = AliasTypeDecl | FnTypeDecl | SumTypeDecl // pub const int_type_name = $if amd64 || arm64 { diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index ed386df2e3..7a73c1a680 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2302,6 +2302,11 @@ fn (mut c Checker) global_decl(mut node ast.GlobalDecl) { } for mut field in node.fields { c.check_valid_snake_case(field.name, 'global name', field.pos) + + if field.name in ast.global_reserved_type_names { + c.error('invalid use of reserved type `${field.name}` as a global name', field.pos) + } + if field.name in c.global_names { c.error('duplicate global `${field.name}`', field.pos) } diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 062f4667b1..6f28c34157 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -4106,7 +4106,9 @@ fn (mut p Parser) global_decl() ast.GlobalDecl { is_exported: is_exported } fields << field - p.table.global_scope.register(field) + if name !in ast.global_reserved_type_names { + p.table.global_scope.register(field) + } comments = [] if !is_block { break diff --git a/vlib/v/parser/tests/global_reserved_name_err.out b/vlib/v/parser/tests/global_reserved_name_err.out new file mode 100644 index 0000000000..bfbd65904d --- /dev/null +++ b/vlib/v/parser/tests/global_reserved_name_err.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/global_reserved_name_err.vv:5:2: error: invalid use of reserved type `array` as a global name + 3 | + 4 | __global ( + 5 | array [16]int + | ~~~~~ + 6 | ) + 7 | diff --git a/vlib/v/parser/tests/global_reserved_name_err.vv b/vlib/v/parser/tests/global_reserved_name_err.vv new file mode 100644 index 0000000000..2be2036be1 --- /dev/null +++ b/vlib/v/parser/tests/global_reserved_name_err.vv @@ -0,0 +1,9 @@ +@[has_globals] +module main + +__global ( + array [16]int +) + +fn main() { +}