From 6a4bfef2c565af0276a56619a6c1feda3bda1808 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Thu, 3 Aug 2023 14:12:31 +0530 Subject: [PATCH] parser: disallow having builtin type as type names for `enum`, `sum type` and `alias` (#19043) --- vlib/v/parser/parser.v | 9 ++++++--- vlib/v/parser/tests/builtin_alias_type_name_err.out | 3 +++ vlib/v/parser/tests/builtin_alias_type_name_err.vv | 1 + vlib/v/parser/tests/builtin_enum_type_name_err.out | 5 +++++ vlib/v/parser/tests/builtin_enum_type_name_err.vv | 5 +++++ vlib/v/parser/tests/builtin_sum_type_type_name_err.out | 3 +++ vlib/v/parser/tests/builtin_sum_type_type_name_err.vv | 1 + 7 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 vlib/v/parser/tests/builtin_alias_type_name_err.out create mode 100644 vlib/v/parser/tests/builtin_alias_type_name_err.vv create mode 100644 vlib/v/parser/tests/builtin_enum_type_name_err.out create mode 100644 vlib/v/parser/tests/builtin_enum_type_name_err.vv create mode 100644 vlib/v/parser/tests/builtin_sum_type_type_name_err.out create mode 100644 vlib/v/parser/tests/builtin_sum_type_type_name_err.vv diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 9de815ae7b..d6db79abc2 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -4011,7 +4011,8 @@ fn (mut p Parser) enum_decl() ast.EnumDecl { } is_pub: is_pub }) - if idx == -1 { + if idx in [ast.invalid_type_idx, ast.string_type_idx, ast.rune_type_idx, ast.array_type_idx, + ast.map_type_idx] { p.error_with_pos('cannot register enum `${name}`, another type with this name exists', end_pos) } @@ -4109,7 +4110,8 @@ fn (mut p Parser) type_decl() ast.TypeDecl { } is_pub: is_pub }) - if typ == ast.invalid_type_idx { + if typ in [ast.invalid_type_idx, ast.string_type_idx, ast.rune_type_idx, ast.array_type_idx, + ast.map_type_idx] { p.error_with_pos('cannot register sum type `${name}`, another type with this name exists', name_pos) return ast.SumTypeDecl{} @@ -4149,7 +4151,8 @@ fn (mut p Parser) type_decl() ast.TypeDecl { is_pub: is_pub }) type_end_pos := p.prev_tok.pos() - if idx == ast.invalid_type_idx { + if idx in [ast.invalid_type_idx, ast.string_type_idx, ast.rune_type_idx, ast.array_type_idx, + ast.map_type_idx] { p.error_with_pos('cannot register alias `${name}`, another type with this name exists', name_pos) return ast.AliasTypeDecl{} diff --git a/vlib/v/parser/tests/builtin_alias_type_name_err.out b/vlib/v/parser/tests/builtin_alias_type_name_err.out new file mode 100644 index 0000000000..342195e7ac --- /dev/null +++ b/vlib/v/parser/tests/builtin_alias_type_name_err.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/builtin_alias_type_name_err.vv:1:6: error: cannot register alias `string`, another type with this name exists + 1 | type string = int + | ~~~~~~ diff --git a/vlib/v/parser/tests/builtin_alias_type_name_err.vv b/vlib/v/parser/tests/builtin_alias_type_name_err.vv new file mode 100644 index 0000000000..cb8694ad65 --- /dev/null +++ b/vlib/v/parser/tests/builtin_alias_type_name_err.vv @@ -0,0 +1 @@ +type string = int diff --git a/vlib/v/parser/tests/builtin_enum_type_name_err.out b/vlib/v/parser/tests/builtin_enum_type_name_err.out new file mode 100644 index 0000000000..6d9412a9de --- /dev/null +++ b/vlib/v/parser/tests/builtin_enum_type_name_err.out @@ -0,0 +1,5 @@ +vlib/v/parser/tests/builtin_enum_type_name_err.vv:1:6: error: cannot register enum `rune`, another type with this name exists + 1 | enum rune { + | ~~~~ + 2 | a + 3 | b diff --git a/vlib/v/parser/tests/builtin_enum_type_name_err.vv b/vlib/v/parser/tests/builtin_enum_type_name_err.vv new file mode 100644 index 0000000000..af9f67e04a --- /dev/null +++ b/vlib/v/parser/tests/builtin_enum_type_name_err.vv @@ -0,0 +1,5 @@ +enum rune { + a + b + c +} diff --git a/vlib/v/parser/tests/builtin_sum_type_type_name_err.out b/vlib/v/parser/tests/builtin_sum_type_type_name_err.out new file mode 100644 index 0000000000..7cf9818396 --- /dev/null +++ b/vlib/v/parser/tests/builtin_sum_type_type_name_err.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/builtin_sum_type_type_name_err.vv:1:6: error: cannot register sum type `map`, another type with this name exists + 1 | type map = int | u64 + | ~~~ diff --git a/vlib/v/parser/tests/builtin_sum_type_type_name_err.vv b/vlib/v/parser/tests/builtin_sum_type_type_name_err.vv new file mode 100644 index 0000000000..22138a9483 --- /dev/null +++ b/vlib/v/parser/tests/builtin_sum_type_type_name_err.vv @@ -0,0 +1 @@ +type map = int | u64