From 1824b9421910e0956aedee4f88e9f6b1b8929f10 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sun, 18 May 2025 02:40:30 -0300 Subject: [PATCH] checker: fix resolver for returning struct generic (fix #24493) (#24506) --- vlib/v/checker/fn.v | 2 +- .../generics/generic_struct_return_test.v | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generics/generic_struct_return_test.v diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 51f9d88e0..ec7426012 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -1867,7 +1867,7 @@ fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) ast. // resolve return generics struct to concrete type if func.generic_names.len > 0 && func.return_type.has_flag(.generic) - && c.table.cur_fn != unsafe { nil } && c.table.cur_fn.generic_names.len == 0 { + && c.table.cur_fn != unsafe { nil } && c.needs_unwrap_generic_type(func.return_type) { node.return_type = c.table.unwrap_generic_type(func.return_type, func.generic_names, concrete_types) } else { diff --git a/vlib/v/tests/generics/generic_struct_return_test.v b/vlib/v/tests/generics/generic_struct_return_test.v new file mode 100644 index 000000000..9cad6442d --- /dev/null +++ b/vlib/v/tests/generics/generic_struct_return_test.v @@ -0,0 +1,33 @@ +struct Thing[T] { + count int + items []T +} + +fn new_thing[T](count int) Thing[T] { + return Thing[T]{ + count: count + items: []T{len: count} + } +} + +fn (t &Thing[T]) get(item int) T { + return t.items[item] +} + +fn specific(p int) int { + thing := new_thing[int](2) + thing.get(1) + return p +} + +fn generic[T](p T) int { + thing := new_thing[f32](2) + thing.get(1) + return p +} + +fn test_main() { + r1 := generic(0) + r2 := specific(0) + assert r1 == r2 +} -- 2.39.5