From 55d9c240632a0b815efe5383e71481721b8330d4 Mon Sep 17 00:00:00 2001 From: yuyi Date: Sun, 26 Dec 2021 22:44:41 +0800 Subject: [PATCH] ast: fix generic fn with multiple return (#12971) --- vlib/v/ast/table.v | 5 +- vlib/v/tests/generic_fn_multi_return_test.v | 53 +++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 vlib/v/tests/generic_fn_multi_return_test.v diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 42b241b994..13c0636d8b 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -1056,8 +1056,9 @@ pub fn (mut t Table) find_or_register_multi_return(mr_typs []Type) int { mut cname := 'multi_return' for i, mr_typ in mr_typs { mr_type_sym := t.sym(mr_typ) - name += mr_type_sym.name - cname += '_$mr_type_sym.cname' + ref, cref := if mr_typ.is_ptr() { '&', 'ref_' } else { '', '' } + name += '$ref$mr_type_sym.name' + cname += '_$cref$mr_type_sym.cname' if i < mr_typs.len - 1 { name += ', ' } diff --git a/vlib/v/tests/generic_fn_multi_return_test.v b/vlib/v/tests/generic_fn_multi_return_test.v new file mode 100644 index 0000000000..02f8f50301 --- /dev/null +++ b/vlib/v/tests/generic_fn_multi_return_test.v @@ -0,0 +1,53 @@ +fn test_generic_fn_multi_return() { + mut a1 := GenRef{32, 99} + b1, c1 := a1.generic_reference() or { + assert false + return + } + println(b1) + assert b1 == 32 + println(c1) + assert *c1 == 99 + + mut a2 := GenRef{322, 999} + b2, c2 := a2.generic_reference() or { + assert false + return + } + println(b2) + assert b2 == 322 + println(c2) + assert *c2 == 999 + + mut a3 := GenRef{22, 77} + b3, c3 := a3.generic_reference() or { + assert false + return + } + println(b3) + assert b3 == 22 + println(c3) + assert *c3 == 77 + + mut a4 := GenRef{2.2, 777} + b4, c4 := a4.generic_reference() or { + assert false + return + } + println(b4) + assert b4 == 2.2 + println(c4) + assert *c4 == 777 +} + +struct GenRef { + key K + val V +} + +fn (mut self GenRef) generic_reference() ?(K, &V) { + if false { + return none + } + return self.key, unsafe { &self.val } +}