From db57c0df51272f12a661b9afbfc2f65af5054bd9 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Fri, 10 Jan 2025 08:54:04 -0300 Subject: [PATCH] fix --- vlib/v/gen/c/fn.v | 8 ++++ .../tests/fns/call_member_from_ptr_ptr_test.v | 43 +++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 vlib/v/tests/fns/call_member_from_ptr_ptr_test.v diff --git a/vlib/v/gen/c/fn.v b/vlib/v/gen/c/fn.v index d84ba1040b95a8..9442abab7fb14c 100644 --- a/vlib/v/gen/c/fn.v +++ b/vlib/v/gen/c/fn.v @@ -1879,7 +1879,15 @@ fn (mut g Gen) fn_call(node ast.CallExpr) { g.write('(*(${g.styp(fn_typ)}*)') } } + needs_deref := node.left_type.nr_muls() > 1 + if needs_deref { + g.write('(') + g.write('*'.repeat(node.left_type.nr_muls() - 1)) + } g.expr(node.left) + if needs_deref { + g.write(')') + } if node.left_type.is_ptr() { g.write('->') } else { diff --git a/vlib/v/tests/fns/call_member_from_ptr_ptr_test.v b/vlib/v/tests/fns/call_member_from_ptr_ptr_test.v new file mode 100644 index 00000000000000..1231b2595b0a9b --- /dev/null +++ b/vlib/v/tests/fns/call_member_from_ptr_ptr_test.v @@ -0,0 +1,43 @@ +import gg + +pub type WindowResizeFn = fn (window &Window, w int, h int) + +@[heap] +pub struct Window { + id string = '_window_' +pub mut: + resize_fn WindowResizeFn = unsafe { nil } +} + +@[params] +pub struct WindowParams { +pub: + on_resize WindowResizeFn = unsafe { nil } +} + +fn window_resized(event gg.Event, mut w &Window) { + window_width, window_height := 200, 100 + + if w.resize_fn != WindowResizeFn(0) { + w.resize_fn(w, window_width, window_height) + } +} + +fn on_event(e &gg.Event, mut w Window) { + window_resized(e, mut w) +} + +fn on_resize(window &Window, w int, h int) { + assert w == 200 + assert h == 100 +} + +fn test_main() { + e := gg.Event{} + mut w := &Window{ + resize_fn: on_resize + } + + on_event(e, mut w) + assert true +}