From 8743be7de9b5181f1d3f844a1a6b600fabd9344e Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Thu, 26 Feb 2026 11:33:13 +0300 Subject: [PATCH] checker: fix implementing a generic interface using a concrete type does not compile (fixes #24060) --- vlib/v/checker/checker.v | 3 +- ..._interface_implements_concrete_type_test.v | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 vlib/v/tests/generics/generic_interface_implements_concrete_type_test.v diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index bfe6712a2..2793171e8 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1345,7 +1345,8 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to if mut inter_sym.info is ast.Interface { mut generic_type := interface_type mut generic_info := inter_sym.info - if inter_sym.info.parent_type.has_flag(.generic) { + if inter_sym.info.parent_type.has_flag(.generic) && (inter_sym.info.concrete_types.len == 0 + || inter_sym.info.concrete_types.any(it.has_flag(.generic))) { parent_sym := c.table.sym(inter_sym.info.parent_type) if parent_sym.info is ast.Interface { generic_type = inter_sym.info.parent_type diff --git a/vlib/v/tests/generics/generic_interface_implements_concrete_type_test.v b/vlib/v/tests/generics/generic_interface_implements_concrete_type_test.v new file mode 100644 index 000000000..29b9b6cde --- /dev/null +++ b/vlib/v/tests/generics/generic_interface_implements_concrete_type_test.v @@ -0,0 +1,38 @@ +// Regression test for #24060. +// Explicit `implements Interface[Concrete]` should not force generic inference. + +struct System[T] { +mut: + data T +} + +interface Transaction[T] { +mut: + run(mut system System[T]) +} + +struct Data { +mut: + dummy string +} + +struct CreateDocumentTransaction implements Transaction[Data] {} + +fn (mut txn CreateDocumentTransaction) run(mut system System[Data]) { + system.data.dummy = 'updated' +} + +fn apply_transaction(mut system System[Data], mut transaction Transaction[Data]) { + transaction.run(mut system) +} + +fn test_generic_interface_implemented_with_concrete_type() { + mut system := System[Data]{ + data: Data{ + dummy: 'initial' + } + } + mut transaction := CreateDocumentTransaction{} + apply_transaction(mut system, mut transaction) + assert system.data.dummy == 'updated' +} -- 2.39.5