From 9ea753e8538f5156fd5ef79e83efb0483fe43a71 Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 28 May 2021 23:51:55 +0800 Subject: [PATCH] checker: fix generic with fixed array parameter (#10233) --- vlib/v/checker/checker.v | 35 +++++++++++++------ .../generics_with_fixed_array_type_test.v | 10 ++++++ 2 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 vlib/v/tests/generics_with_fixed_array_type_test.v diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 1d7b1a592b..b0f0f8f581 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -6453,19 +6453,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) + mut typ_sym := c.table.get_final_type_symbol(typ) node.left_type = typ - typ_sym := c.table.get_final_type_symbol(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 - } - 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/tests/generics_with_fixed_array_type_test.v b/vlib/v/tests/generics_with_fixed_array_type_test.v new file mode 100644 index 0000000000..40f383baf0 --- /dev/null +++ b/vlib/v/tests/generics_with_fixed_array_type_test.v @@ -0,0 +1,10 @@ +fn show_element(arr &T) string { + return unsafe { '${arr[1]}' } +} + +fn test_generic_with_fixed_array_type() { + a := [1, 2, 3]! + ret := show_element(a) + println(ret) + assert ret == '2' +}