From 5e12d3483c728fd377ccf19177180d4782332d82 Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 2 Jun 2023 15:52:29 +0800 Subject: [PATCH] checker: fix generic fn with nested generic fn call (fix #18285) (#18314) --- vlib/v/checker/fn.v | 22 ++++++++++++++----- ...eric_fn_with_nested_generic_fn_call_test.v | 14 ++++++++++++ 2 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 vlib/v/tests/generic_fn_with_nested_generic_fn_call_test.v diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index fbc0715cc1c0af..cdd0326a8862b3 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -1354,13 +1354,23 @@ fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) ast. } } return node.return_type - } else if typ := c.table.resolve_generic_to_concrete(func.return_type, func.generic_names, - concrete_types) - { - if typ.has_flag(.generic) { - node.return_type = typ + } else { + if node.concrete_types.len > 0 && !node.concrete_types.any(it.has_flag(.generic)) { + if typ := c.table.resolve_generic_to_concrete(func.return_type, func.generic_names, + node.concrete_types) + { + node.return_type = typ + return typ + } + } + if typ := c.table.resolve_generic_to_concrete(func.return_type, func.generic_names, + concrete_types) + { + if typ.has_flag(.generic) { + node.return_type = typ + } + return typ } - return typ } } return func.return_type diff --git a/vlib/v/tests/generic_fn_with_nested_generic_fn_call_test.v b/vlib/v/tests/generic_fn_with_nested_generic_fn_call_test.v new file mode 100644 index 00000000000000..e0023e9d2e1e9c --- /dev/null +++ b/vlib/v/tests/generic_fn_with_nested_generic_fn_call_test.v @@ -0,0 +1,14 @@ +struct Test {} + +fn unmarshal[T]() ! { + get_number[int]()! +} + +fn get_number[T]() !T { + return T(42) +} + +fn test_generic_fn_with_nested_generic_fn_call() { + unmarshal[Test]()! + assert true +}