diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index c8ba1c068b..af5c831591 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3864,40 +3864,25 @@ pub fn (mut c Checker) index_expr(mut node ast.IndexExpr) ast.Type { mut typ := c.expr(node.left) mut typ_sym := c.table.final_sym(typ) node.left_type = typ - for { - match typ_sym.kind { - .map { - node.is_map = true - break - } - .array { - node.is_array = true - if node.or_expr.kind != .absent && node.index is ast.RangeExpr { - c.error('custom error handling on range expressions for arrays is not supported yet.', - node.or_expr.pos) - } - break - } - .array_fixed { - node.is_farray = true - break - } - .any { - gname := typ_sym.name - typ = c.unwrap_generic(typ) - node.left_type = typ - typ_sym = c.table.final_sym(typ) - if typ.is_ptr() { - continue - } else { - c.error('generic type $gname does not support indexing, pass an array, or a reference instead, e.g. []$gname or &$gname', - node.pos) - } - } - else { - break + match typ_sym.kind { + .map { + node.is_map = true + } + .array { + node.is_array = true + if node.or_expr.kind != .absent && node.index is ast.RangeExpr { + c.error('custom error handling on range expressions for arrays is not supported yet.', + node.or_expr.pos) } } + .array_fixed { + node.is_farray = true + } + .any { + typ = c.unwrap_generic(typ) + typ_sym = c.table.final_sym(typ) + } + 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/generic_param_used_as_an_array_err.out b/vlib/v/checker/tests/generic_param_used_as_an_array_err.out deleted file mode 100644 index eb4ee7cbe8..0000000000 --- a/vlib/v/checker/tests/generic_param_used_as_an_array_err.out +++ /dev/null @@ -1,6 +0,0 @@ -vlib/v/checker/tests/generic_param_used_as_an_array_err.vv:2:10: error: generic type T does not support indexing, pass an array, or a reference instead, e.g. []T or &T - 1 | fn test(arr T) { - 2 | a := arr[1] - | ~~~ - 3 | println(a) - 4 | } diff --git a/vlib/v/checker/tests/generic_param_used_as_an_array_err.vv b/vlib/v/checker/tests/generic_param_used_as_an_array_err.vv deleted file mode 100644 index f545b77147..0000000000 --- a/vlib/v/checker/tests/generic_param_used_as_an_array_err.vv +++ /dev/null @@ -1,12 +0,0 @@ -fn test(arr T) { - a := arr[1] - println(a) -} - -fn main() { - a := [1, 2, 3]! - test(a) - - b := ['a', 'b', 'c']! - test(b) -} diff --git a/vlib/v/gen/c/index.v b/vlib/v/gen/c/index.v index 341ff5ff7d..d62d6e3cba 100644 --- a/vlib/v/gen/c/index.v +++ b/vlib/v/gen/c/index.v @@ -10,7 +10,7 @@ fn (mut g Gen) index_expr(node ast.IndexExpr) { if node.index is ast.RangeExpr { g.range_expr(node, node.index) } else { - sym := g.table.final_sym(node.left_type) + sym := g.table.final_sym(g.unwrap_generic(node.left_type)) if sym.kind == .array { g.index_of_array(node, sym) } else if sym.kind == .array_fixed { diff --git a/vlib/v/tests/generics_with_fixed_array_type_test.v b/vlib/v/tests/generics_with_fixed_array_type_test.v index 40f383baf0..c7f0a6eed4 100644 --- a/vlib/v/tests/generics_with_fixed_array_type_test.v +++ b/vlib/v/tests/generics_with_fixed_array_type_test.v @@ -1,5 +1,5 @@ -fn show_element(arr &T) string { - return unsafe { '${arr[1]}' } +fn show_element(arr T) string { + return '${arr[1]}' } fn test_generic_with_fixed_array_type() { diff --git a/vlib/v/tests/inout/generic_fn_with_array_arg.out b/vlib/v/tests/inout/generic_fn_with_array_arg.out new file mode 100644 index 0000000000..b414108e81 --- /dev/null +++ b/vlib/v/tests/inout/generic_fn_with_array_arg.out @@ -0,0 +1,6 @@ +1 +2 +3 +4 +5 +6 diff --git a/vlib/v/tests/inout/generic_fn_with_array_arg.vv b/vlib/v/tests/inout/generic_fn_with_array_arg.vv new file mode 100644 index 0000000000..c13159a1f4 --- /dev/null +++ b/vlib/v/tests/inout/generic_fn_with_array_arg.vv @@ -0,0 +1,15 @@ +fn main() { + mut a := [1, 2, 3] + mut b := [4, 5, 6]! + + func(mut a) + func(mut b) +} + +fn func(mut t T) { + $if T is $Array { + for i in 0 .. t.len { + println(t[i]) + } + } +}