From e5379736c1e1ef9858bc7818599a5870243d14f4 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 15 Apr 2026 05:17:10 +0300 Subject: [PATCH] cgen: fix inline `if` expression cannot return a closure (fixes #26595) --- .../if_expr_return_closure_with_locals_test.v | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 vlib/v/tests/conditions/ifs/if_expr_return_closure_with_locals_test.v diff --git a/vlib/v/tests/conditions/ifs/if_expr_return_closure_with_locals_test.v b/vlib/v/tests/conditions/ifs/if_expr_return_closure_with_locals_test.v new file mode 100644 index 000000000..4d38e585d --- /dev/null +++ b/vlib/v/tests/conditions/ifs/if_expr_return_closure_with_locals_test.v @@ -0,0 +1,48 @@ +module main + +import time + +struct Event { +mut: + value int +} + +@[heap] +struct Cfg { + wrap bool + delay time.Duration + callback fn (&int, mut Event) = unsafe { nil } +} + +fn resolve(cfg Cfg) fn (&int, mut Event) { + user_cb := cfg.callback + result := if cfg.wrap && cfg.delay > 0 { + tag := 'tag' + dur := cfg.delay + fn [user_cb, tag, dur] (x &int, mut e Event) { + _ = dur + if user_cb != unsafe { nil } { + user_cb(x, mut e) + } + e.value += 1 + println('wrapped(${tag}): ${e.value}') + } + } else { + cfg.callback + } + return result +} + +fn test_if_expr_can_return_closure_after_local_decls() { + cb := resolve(Cfg{ + wrap: true + delay: 2 * time.second + callback: fn (x &int, mut e Event) { + e.value = *x + } + }) + n := 41 + mut e := Event{} + cb(&n, mut e) + assert e.value == 42 +} -- 2.39.5