From 01a719a718ab66a37629835b1d04cfef7e72ef64 Mon Sep 17 00:00:00 2001 From: kbkpbot Date: Sun, 30 Mar 2025 20:28:40 +0800 Subject: [PATCH] type_resolver: fix comptime_for array generic (fix #23969) (#24089) --- .../comptime_for_selector_array_test.v | 30 +++++++++++++++++++ vlib/v/type_resolver/generic_resolver.v | 3 +- 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/comptime/comptime_for_selector_array_test.v diff --git a/vlib/v/tests/comptime/comptime_for_selector_array_test.v b/vlib/v/tests/comptime/comptime_for_selector_array_test.v new file mode 100644 index 000000000..0d95c2ce4 --- /dev/null +++ b/vlib/v/tests/comptime/comptime_for_selector_array_test.v @@ -0,0 +1,30 @@ +struct MyStruct { + f_array_int []int + f_array_u8 []u8 + f_array_string []string +} + +fn arrarr[T](x []T) string { + $if T is $string { + return 'arrarr string => ${x}' + } $else $if T is u8 { + return 'arrarr u8 => ${x}' + } $else $if T is $int { + return 'arrarr int => ${x}' + } $else { + return 'arrarr unknown => ${x}' + } +} + +fn test_comptime_for_selector_array() { + x := MyStruct{ + f_array_int: [10244] + f_array_u8: [u8(13)] + f_array_string: ['hello', 'world'] + } + mut out := '' + $for f in MyStruct.fields { + out += arrarr(x.$(f.name)) + } + assert out == "arrarr int => [10244]arrarr u8 => [13]arrarr string => ['hello', 'world']" +} diff --git a/vlib/v/type_resolver/generic_resolver.v b/vlib/v/type_resolver/generic_resolver.v index ed5b85e09..39a44c6ae 100644 --- a/vlib/v/type_resolver/generic_resolver.v +++ b/vlib/v/type_resolver/generic_resolver.v @@ -275,7 +275,8 @@ pub fn (mut t TypeResolver) resolve_args(cur_fn &ast.FnDecl, func &ast.Fn, mut n arg_sym := t.table.final_sym(call_arg.typ) param_sym := t.table.sym(param_typ) if arg_sym.kind == .array && param_sym.kind == .array { - comptime_args[k] = t.get_generic_array_element_type(arg_sym.info as ast.Array) + comptime_sym := t.table.sym(comptime_args[k]) + comptime_args[k] = t.get_generic_array_element_type(comptime_sym.info as ast.Array) } else if arg_sym.info is ast.Map && param_sym.info is ast.Map { comptime_sym := t.table.sym(comptime_args[k]) if comptime_sym.info is ast.Map { -- 2.39.5