From edf6c22e9c5110cfb1021a6d7959a7c2b2aa6b03 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 23 Jul 2025 14:49:25 -0300 Subject: [PATCH] cgen: fix callback codegen on generic struct resolution (fix #24947) (#24948) --- vlib/v/ast/table.v | 3 ++ .../struct_anon_generic_fn_field_test.v | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 vlib/v/tests/structs/struct_anon_generic_fn_field_test.v diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 7d275ef5a5..1ccba04674 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -1318,6 +1318,9 @@ pub fn (mut t Table) find_or_register_fn_type(f Fn, is_anon bool, has_decl bool) anon := f.name == '' || is_anon existing_idx := t.type_idxs[name] if existing_idx > 0 && t.type_symbols[existing_idx].kind != .placeholder { + if t.type_symbols[existing_idx].info is FnType && !has_decl { + t.type_symbols[existing_idx].info.has_decl = has_decl + } return existing_idx } return t.register_sym( diff --git a/vlib/v/tests/structs/struct_anon_generic_fn_field_test.v b/vlib/v/tests/structs/struct_anon_generic_fn_field_test.v new file mode 100644 index 0000000000..3eceaa0eee --- /dev/null +++ b/vlib/v/tests/structs/struct_anon_generic_fn_field_test.v @@ -0,0 +1,37 @@ +pub struct ChunksArrayDecoder[T] { + callback fn (t T) = unsafe { nil } +} + +pub fn new_chunks_array_decoder[T](callback fn (t T)) &ChunksArrayDecoder[T] { + return &ChunksArrayDecoder[T]{ + callback: callback + } +} + +struct Person { + name string + age int + kgs f32 +} + +@[heap] +struct People { +mut: + persons int + kgs f32 +} + +fn (mut people People) callback(person Person) { + people.persons++ + people.kgs += person.kgs +} + +fn module_callback(person Person) { + println('person: ${person}') +} + +fn test_main() { + mut people := &People{} + mut decoder := new_chunks_array_decoder[Person](people.callback) + _ = decoder +}