From df118aa448aa72279d4872931492b73395186e94 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 11 Mar 2026 16:31:04 +0300 Subject: [PATCH] cgen: builder error (fixes #14819) --- vlib/v/gen/c/cgen.v | 8 ++--- .../generic_callback_assignment.c.must_have | 4 +++ .../c/testdata/generic_callback_assignment.vv | 32 +++++++++++++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 vlib/v/gen/c/testdata/generic_callback_assignment.c.must_have create mode 100644 vlib/v/gen/c/testdata/generic_callback_assignment.vv diff --git a/vlib/v/gen/c/cgen.v b/vlib/v/gen/c/cgen.v index 818a8b907..2ce1de989 100644 --- a/vlib/v/gen/c/cgen.v +++ b/vlib/v/gen/c/cgen.v @@ -3498,11 +3498,9 @@ fn (mut g Gen) expr_with_cast(expr ast.Expr, got_type_raw ast.Type, expected_typ g.write('*') } } - if (exp_sym.kind == .function && !expected_type.has_option_or_result()) - || (g.inside_struct_init && expected_type == ast.voidptr_type - && expected_type != got_type_raw && expr !is ast.StructInit) - || (g.inside_call && expected_type == ast.voidptr_type && expr is ast.ArrayInit - && (expr as ast.ArrayInit).is_fixed) { + if (g.inside_struct_init && expected_type == ast.voidptr_type && expected_type != got_type_raw + && expr !is ast.StructInit) || (g.inside_call && expected_type == ast.voidptr_type + && expr is ast.ArrayInit && (expr as ast.ArrayInit).is_fixed) { g.write('(voidptr)') } // no cast diff --git a/vlib/v/gen/c/testdata/generic_callback_assignment.c.must_have b/vlib/v/gen/c/testdata/generic_callback_assignment.c.must_have new file mode 100644 index 000000000..7d2a63a3f --- /dev/null +++ b/vlib/v/gen/c/testdata/generic_callback_assignment.c.must_have @@ -0,0 +1,4 @@ +main__Client_on_T_main__Ready(client, _S("ready"), main__on_ready); +main__Client_on_T_main__Message(client, _S("message_create"), main__on_message); +client->ready_callback = handler; +client->message_callback = handler; diff --git a/vlib/v/gen/c/testdata/generic_callback_assignment.vv b/vlib/v/gen/c/testdata/generic_callback_assignment.vv new file mode 100644 index 000000000..95973cdf3 --- /dev/null +++ b/vlib/v/gen/c/testdata/generic_callback_assignment.vv @@ -0,0 +1,32 @@ +@[heap] +struct Client { +mut: + ready_callback ReadyHandler = unsafe { nil } + message_callback MessageHandler = unsafe { nil } +} + +struct Ready {} + +struct Message {} + +type ReadyHandler = fn (mut c Client, msg &Ready) + +type MessageHandler = fn (mut c Client, msg &Message) + +fn (mut client Client) on[T](event string, handler fn (mut c Client, msg &T)) { + if event == 'ready' { + client.ready_callback = handler + } else if event == 'message_create' { + client.message_callback = handler + } +} + +fn on_ready(mut _client Client, _message &Ready) {} + +fn on_message(mut _client Client, _message &Message) {} + +fn main() { + mut client := &Client{} + client.on[Ready]('ready', on_ready) + client.on[Message]('message_create', on_message) +} -- 2.39.5