From 6762c9a68958d1367c86d541969b57fe464eca36 Mon Sep 17 00:00:00 2001 From: CreeperFace <165158232+dy-tea@users.noreply.github.com> Date: Fri, 26 Sep 2025 06:59:40 +0100 Subject: [PATCH] checker: disallow function implementing interface (fix #24846) (#25389) --- vlib/v/checker/checker.v | 4 ++++ vlib/v/checker/tests/interface_implemented_by_function.out | 6 ++++++ vlib/v/checker/tests/interface_implemented_by_function.vv | 7 +++++++ 3 files changed, 17 insertions(+) create mode 100644 vlib/v/checker/tests/interface_implemented_by_function.out create mode 100644 vlib/v/checker/tests/interface_implemented_by_function.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 151fe02c5..3b7377fd6 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -1179,6 +1179,10 @@ fn (mut c Checker) type_implements(typ ast.Type, interface_type ast.Type, pos to if typ_sym.name == 'JS.Any' { return true } + if typ_sym.kind == .function && inter_sym.name != 'JS.Any' { + c.error('cannot implement interface `${inter_sym.name}` using function', pos) + return false + } if mut inter_sym.info is ast.Interface { mut generic_type := interface_type mut generic_info := inter_sym.info diff --git a/vlib/v/checker/tests/interface_implemented_by_function.out b/vlib/v/checker/tests/interface_implemented_by_function.out new file mode 100644 index 000000000..268d489fc --- /dev/null +++ b/vlib/v/checker/tests/interface_implemented_by_function.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/interface_implemented_by_function.vv:6:6: error: cannot implement interface `Ch` using function + 4 | + 5 | fn main() { + 6 | id(id) + | ~~ + 7 | } \ No newline at end of file diff --git a/vlib/v/checker/tests/interface_implemented_by_function.vv b/vlib/v/checker/tests/interface_implemented_by_function.vv new file mode 100644 index 000000000..f9e6bfa31 --- /dev/null +++ b/vlib/v/checker/tests/interface_implemented_by_function.vv @@ -0,0 +1,7 @@ +interface Ch {} + +fn id(x Ch) Ch { return x } + +fn main() { + id(id) +} -- 2.39.5