From 4b22ea780349f02a3f25452a63662825a5663ca4 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Sun, 21 May 2023 18:51:57 +0530 Subject: [PATCH] parser: disallow all `array` usage outside of builtin (#18222) --- vlib/v/checker/containers.v | 5 ----- vlib/v/checker/tests/array_decl_type_err.out | 4 ---- vlib/v/parser/parse_type.v | 5 +++++ vlib/v/parser/tests/array_decl_type_alias_err.out | 3 +++ vlib/v/parser/tests/array_decl_type_alias_err.vv | 1 + vlib/v/parser/tests/array_decl_type_err.out | 4 ++++ vlib/v/{checker => parser}/tests/array_decl_type_err.vv | 0 vlib/v/parser/tests/array_decl_type_struct_field_err.out | 7 +++++++ vlib/v/parser/tests/array_decl_type_struct_field_err.vv | 8 ++++++++ 9 files changed, 28 insertions(+), 9 deletions(-) delete mode 100644 vlib/v/checker/tests/array_decl_type_err.out create mode 100644 vlib/v/parser/tests/array_decl_type_alias_err.out create mode 100644 vlib/v/parser/tests/array_decl_type_alias_err.vv create mode 100644 vlib/v/parser/tests/array_decl_type_err.out rename vlib/v/{checker => parser}/tests/array_decl_type_err.vv (100%) create mode 100644 vlib/v/parser/tests/array_decl_type_struct_field_err.out create mode 100644 vlib/v/parser/tests/array_decl_type_struct_field_err.vv diff --git a/vlib/v/checker/containers.v b/vlib/v/checker/containers.v index c0cd25b50..b8e19526b 100644 --- a/vlib/v/checker/containers.v +++ b/vlib/v/checker/containers.v @@ -103,11 +103,6 @@ fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type { c.warn('arrays of references need to be initialized right away, therefore `len:` cannot be used (unless inside `unsafe`)', node.pos) } - - if node.elem_type.idx() == ast.array_type && !c.is_builtin_mod { - c.error('`array` is an internal type, it cannot be used directly. Use `[]int`, `[]Foo` etc', - node.pos) - } return node.typ } diff --git a/vlib/v/checker/tests/array_decl_type_err.out b/vlib/v/checker/tests/array_decl_type_err.out deleted file mode 100644 index 1ba7ff1d2..000000000 --- a/vlib/v/checker/tests/array_decl_type_err.out +++ /dev/null @@ -1,4 +0,0 @@ -vlib/v/checker/tests/array_decl_type_err.vv:1:10: error: `array` is an internal type, it cannot be used directly. Use `[]int`, `[]Foo` etc - 1 | mut a := []array{} - | ~~~~~~~~ - 2 | a.insert(4, '1') diff --git a/vlib/v/parser/parse_type.v b/vlib/v/parser/parse_type.v index 0424cf043..41e6f31d0 100644 --- a/vlib/v/parser/parse_type.v +++ b/vlib/v/parser/parse_type.v @@ -489,6 +489,11 @@ pub fn (mut p Parser) parse_type() ast.Type { if is_atomic { typ = typ.set_flag(.atomic_f) } + if typ.idx() == ast.array_type && !p.builtin_mod && p.mod !in ['os', 'strconv', 'sync'] + && !p.inside_unsafe { + p.error_with_pos('`array` is an internal type, it cannot be used directly. Use `[]int`, `[]Foo` etc', + pos) + } if nr_muls > 0 { typ = typ.set_nr_muls(nr_muls) if is_array && nr_amps > 0 { diff --git a/vlib/v/parser/tests/array_decl_type_alias_err.out b/vlib/v/parser/tests/array_decl_type_alias_err.out new file mode 100644 index 000000000..1c74a1e95 --- /dev/null +++ b/vlib/v/parser/tests/array_decl_type_alias_err.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/array_decl_type_alias_err.vv:1:12: error: `array` is an internal type, it cannot be used directly. Use `[]int`, `[]Foo` etc + 1 | type Arr = array + | ~~~~~ diff --git a/vlib/v/parser/tests/array_decl_type_alias_err.vv b/vlib/v/parser/tests/array_decl_type_alias_err.vv new file mode 100644 index 000000000..5fcca6710 --- /dev/null +++ b/vlib/v/parser/tests/array_decl_type_alias_err.vv @@ -0,0 +1 @@ +type Arr = array diff --git a/vlib/v/parser/tests/array_decl_type_err.out b/vlib/v/parser/tests/array_decl_type_err.out new file mode 100644 index 000000000..6536dc43f --- /dev/null +++ b/vlib/v/parser/tests/array_decl_type_err.out @@ -0,0 +1,4 @@ +vlib/v/parser/tests/array_decl_type_err.vv:1:12: error: `array` is an internal type, it cannot be used directly. Use `[]int`, `[]Foo` etc + 1 | mut a := []array{} + | ~~~~~ + 2 | a.insert(4, '1') diff --git a/vlib/v/checker/tests/array_decl_type_err.vv b/vlib/v/parser/tests/array_decl_type_err.vv similarity index 100% rename from vlib/v/checker/tests/array_decl_type_err.vv rename to vlib/v/parser/tests/array_decl_type_err.vv diff --git a/vlib/v/parser/tests/array_decl_type_struct_field_err.out b/vlib/v/parser/tests/array_decl_type_struct_field_err.out new file mode 100644 index 000000000..088c1d46d --- /dev/null +++ b/vlib/v/parser/tests/array_decl_type_struct_field_err.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/array_decl_type_struct_field_err.vv:6:20: error: `array` is an internal type, it cannot be used directly. Use `[]int`, `[]Foo` etc + 4 | max_size string + 5 | filter_until_hour int = 240 // 10 days + 6 | prune_list array = ['all'] + | ~~~~~ + 7 | time_interval int = 300 // 5 min + 8 | } diff --git a/vlib/v/parser/tests/array_decl_type_struct_field_err.vv b/vlib/v/parser/tests/array_decl_type_struct_field_err.vv new file mode 100644 index 000000000..0d93c8f20 --- /dev/null +++ b/vlib/v/parser/tests/array_decl_type_struct_field_err.vv @@ -0,0 +1,8 @@ + +struct Config { +mut: + max_size string + filter_until_hour int = 240 // 10 days + prune_list array = ['all'] + time_interval int = 300 // 5 min +} -- 2.39.5