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' }