From 48e8099aacbfaac3fdf14d56f94e25c50dc1721e Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Wed, 25 Mar 2026 16:42:23 +0300 Subject: [PATCH] checker: fix builder error when using function types from a module (fixes #18853) --- .../function_types_from_module_test.v | 24 +++++++++++++++++++ .../function_types_from_module/mymod/mymod.v | 22 +++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 vlib/v/tests/modules/function_types_from_module/function_types_from_module_test.v create mode 100644 vlib/v/tests/modules/function_types_from_module/mymod/mymod.v diff --git a/vlib/v/tests/modules/function_types_from_module/function_types_from_module_test.v b/vlib/v/tests/modules/function_types_from_module/function_types_from_module_test.v new file mode 100644 index 000000000..ad8232a26 --- /dev/null +++ b/vlib/v/tests/modules/function_types_from_module/function_types_from_module_test.v @@ -0,0 +1,24 @@ +module main + +import mymod + +struct RequestContext {} + +fn request_id() mymod.MiddlewareFn { + return fn (next mymod.HandlerFn) mymod.HandlerFn { + return fn [next] (c mymod.Context) Error { + return next(c) + } + } +} + +fn test_function_types_imported_from_a_module_can_return_each_other() { + middleware := request_id() + mut app := mymod.new() + app.use(middleware) + handler := middleware(fn (_ mymod.Context) Error { + return Error{} + }) + err := handler(RequestContext{}) + assert err.code() == 0 +} diff --git a/vlib/v/tests/modules/function_types_from_module/mymod/mymod.v b/vlib/v/tests/modules/function_types_from_module/mymod/mymod.v new file mode 100644 index 000000000..06c665c78 --- /dev/null +++ b/vlib/v/tests/modules/function_types_from_module/mymod/mymod.v @@ -0,0 +1,22 @@ +module mymod + +pub interface Context {} + +pub type HandlerFn = fn (c Context) Error + +pub type MiddlewareFn = fn (next HandlerFn) HandlerFn + +pub struct App { +mut: + middlewares []MiddlewareFn +} + +// use appends middleware handlers in registration order. +pub fn (mut app App) use(middleware ...MiddlewareFn) { + app.middlewares << middleware +} + +// new returns an empty application. +pub fn new() App { + return App{} +} -- 2.39.5