From af62364a29312a09f76aa9ad3f734790e534c162 Mon Sep 17 00:00:00 2001 From: CreeperFace <165158232+dy-tea@users.noreply.github.com> Date: Sat, 8 Nov 2025 07:16:38 +0000 Subject: [PATCH] checker: maintain correct ref level in generic fn (fix #25676) (#25687) --- vlib/v/checker/check_types.v | 8 +++++++- vlib/v/tests/generics/generic_fn_ref_level_test.v | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generics/generic_fn_ref_level_test.v diff --git a/vlib/v/checker/check_types.v b/vlib/v/checker/check_types.v index b11814728..72959277c 100644 --- a/vlib/v/checker/check_types.v +++ b/vlib/v/checker/check_types.v @@ -1067,7 +1067,13 @@ fn (mut c Checker) infer_fn_generic_types(func &ast.Fn, mut node ast.CallExpr) { } // resolve &T &&T ... if param.typ.nr_muls() > 0 && typ.nr_muls() > 0 { - typ = typ.set_nr_muls(0) + param_muls := param.typ.nr_muls() + arg_muls := typ.nr_muls() + typ = if arg_muls >= param_muls { + typ.set_nr_muls(arg_muls - param_muls) + } else { + typ.set_nr_muls(0) + } } } else if param.typ.has_flag(.generic) { arg_typ := if c.table.sym(arg.typ).kind == .any { diff --git a/vlib/v/tests/generics/generic_fn_ref_level_test.v b/vlib/v/tests/generics/generic_fn_ref_level_test.v new file mode 100644 index 000000000..21825b60d --- /dev/null +++ b/vlib/v/tests/generics/generic_fn_ref_level_test.v @@ -0,0 +1,11 @@ +fn foo[T](v &T) string { + return typeof(v).name +} + +fn test_main() { + i := i8(0) + ip := &i + ipp := &ip + assert foo(ip) == '&i8' + assert foo(ipp) == '&&i8' +} -- 2.39.5