From f351ff037e7220d10fe08cb0f9520498e33175bf Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Wed, 9 Jun 2021 11:46:17 +0300 Subject: [PATCH] Revert "checker: check generic type indexing error (#10345)" This reverts commit 103c777ad62571c9d3e07d4688c972264ad0e113. Passing references to values should be allowed, and is already used in vinix: `pub fn cas(_here &T, _ifthis T, writethis T) bool {` --- vlib/v/checker/checker.v | 39 ++++++++++++------- .../tests/generics_type_para_index_err.out | 6 --- .../generics_with_fixed_array_type_test.v} | 3 +- 3 files changed, 26 insertions(+), 22 deletions(-) delete mode 100644 vlib/v/checker/tests/generics_type_para_index_err.out rename vlib/v/{checker/tests/generics_type_para_index_err.vv => tests/generics_with_fixed_array_type_test.v} (67%) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 2cd6adca86..8567d3f694 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -6493,23 +6493,32 @@ fn (mut c Checker) check_index(typ_sym &ast.TypeSymbol, index ast.Expr, index_ty pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type { mut typ := c.expr(node.left) - typ_sym := c.table.get_final_type_symbol(typ) + mut typ_sym := c.table.get_final_type_symbol(typ) node.left_type = typ - match typ_sym.kind { - .map { - node.is_map = true + for { + match typ_sym.kind { + .map { + node.is_map = true + break + } + .array { + node.is_array = true + break + } + .array_fixed { + node.is_farray = true + break + } + .any { + typ = c.unwrap_generic(typ) + node.left_type = typ + typ_sym = c.table.get_final_type_symbol(typ) + continue + } + else { + break + } } - .array { - node.is_array = true - } - .array_fixed { - node.is_farray = true - } - .any { - c.error('generic type `$typ_sym.name` does not support indexing, please use compound type, e.g. `[]$typ_sym.name`', - node.pos) - } - else {} } if typ_sym.kind !in [.array, .array_fixed, .string, .map] && !typ.is_ptr() && typ !in [ast.byteptr_type, ast.charptr_type] && !typ.has_flag(.variadic) { diff --git a/vlib/v/checker/tests/generics_type_para_index_err.out b/vlib/v/checker/tests/generics_type_para_index_err.out deleted file mode 100644 index 42dc1390fd..0000000000 --- a/vlib/v/checker/tests/generics_type_para_index_err.out +++ /dev/null @@ -1,6 +0,0 @@ -vlib/v/checker/tests/generics_type_para_index_err.vv:2:24: error: generic type `T` does not support indexing, please use compound type, e.g. `[]T` - 1 | fn show_element(arr &T) string { - 2 | return unsafe { '${arr[1]}' } - | ~~~ - 3 | } - 4 | diff --git a/vlib/v/checker/tests/generics_type_para_index_err.vv b/vlib/v/tests/generics_with_fixed_array_type_test.v similarity index 67% rename from vlib/v/checker/tests/generics_type_para_index_err.vv rename to vlib/v/tests/generics_with_fixed_array_type_test.v index 7066a08a4c..40f383baf0 100644 --- a/vlib/v/checker/tests/generics_type_para_index_err.vv +++ b/vlib/v/tests/generics_with_fixed_array_type_test.v @@ -2,8 +2,9 @@ fn show_element(arr &T) string { return unsafe { '${arr[1]}' } } -fn main() { +fn test_generic_with_fixed_array_type() { a := [1, 2, 3]! ret := show_element(a) println(ret) + assert ret == '2' }