From e31be9f5c426f6ac805d7ef9b23ff2bf21c84bcf Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 17 Jun 2021 00:17:07 +0800 Subject: [PATCH] checker: fix generic fn assign (#10479) --- vlib/v/checker/checker.v | 3 ++- .../generic_fn_assign_generics_struct_test.v | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 19af18757d..ee9266c9c3 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3625,7 +3625,8 @@ pub fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { } } if !is_blank_ident && !left.is_auto_deref_var() && !right.is_auto_deref_var() - && right_sym.kind != .placeholder && left_sym.kind != .interface_ { + && right_sym.kind != .placeholder && left_sym.kind != .interface_ + && !right_type_unwrapped.has_flag(.generic) && !left_type_unwrapped.has_flag(.generic) { // Dual sides check (compatibility check) c.check_expected(right_type_unwrapped, left_type_unwrapped) or { // allow for ptr += 2 diff --git a/vlib/v/tests/generic_fn_assign_generics_struct_test.v b/vlib/v/tests/generic_fn_assign_generics_struct_test.v index 87c7b18dd6..ef007aaf40 100644 --- a/vlib/v/tests/generic_fn_assign_generics_struct_test.v +++ b/vlib/v/tests/generic_fn_assign_generics_struct_test.v @@ -13,3 +13,26 @@ fn test_generics_assign_generics_struct() { println('$x.v') assert x.v == 1 } + +// test generics assign generics struct_init +struct Node { +pub mut: + val T + next &Node = 0 +} + +fn new() &Node { + return &Node{} +} + +fn (mut n Node) add(val T) { + node := &Node{val, 0} + n.next = node +} + +fn test_generic_fn_assign_generic_struct_init() { + mut list := new() + list.add(100) + println(list.next) + assert list.next.val == 100 +}