From 7a56ebf23b57e9dd6f47e92cac671427a4be3103 Mon Sep 17 00:00:00 2001 From: shove Date: Wed, 3 Jan 2024 01:53:12 +0800 Subject: [PATCH] checker: fix too strict checking with generics in assignment type mismatch (fix #20335) (#20346) --- vlib/v/checker/assign.v | 4 ++- .../assign_type_checking_with_generics_test.v | 33 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/assign_type_checking_with_generics_test.v diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index 59118042f7..259d658ee8 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -735,7 +735,9 @@ or use an explicit `unsafe{ a[..] }`, if you do not want a copy of the slice.', } } } - if !is_blank_ident && right_sym.kind != .placeholder && left_sym.kind != .interface_ { + if !is_blank_ident && right_sym.kind != .placeholder && left_sym.kind != .interface_ + && ((!right_type.has_flag(.generic) && !left_type.has_flag(.generic)) + || right_sym.kind != left_sym.kind) { // Dual sides check (compatibility check) c.check_expected(right_type_unwrapped, left_type_unwrapped) or { // allow literal values to auto deref var (e.g.`for mut v in values { v = 1.0 }`) diff --git a/vlib/v/tests/assign_type_checking_with_generics_test.v b/vlib/v/tests/assign_type_checking_with_generics_test.v new file mode 100644 index 0000000000..f9ca514750 --- /dev/null +++ b/vlib/v/tests/assign_type_checking_with_generics_test.v @@ -0,0 +1,33 @@ +module main + +pub type EventListener[T] = fn (T) ! + +pub type Check[T] = fn (T) bool + +pub struct EventController[T] { +mut: + id int + listeners map[int]EventListener[T] +} + +fn (mut ec EventController[T]) generate_id() int { + return ec.id++ +} + +pub fn (mut ec EventController[T]) override(listener EventListener[T]) EventController[T] { + ec.listeners = { + ec.generate_id(): listener + } + return ec +} + +fn use[T](_ EventController[T]) {} + +struct Foo {} + +struct Bar {} + +fn test_main() { + use(EventController[Foo]{}) + use(EventController[Bar]{}) +}