From 350846e11bc67fc7e7b183974e6e7cbd19cd8258 Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Sat, 28 Sep 2024 06:03:22 -0300 Subject: [PATCH] checker: add an error for returning an `any` value in pure V code (prevents invalid cgen) (fix #12623) (#22334) --- vlib/v/checker/fn.v | 3 ++ vlib/v/checker/tests/any_return_type_err.out | 42 ++++++++++++++++++++ vlib/v/checker/tests/any_return_type_err.vv | 30 ++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 vlib/v/checker/tests/any_return_type_err.out create mode 100644 vlib/v/checker/tests/any_return_type_err.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 6e82c43c9..c3a468986 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -118,6 +118,9 @@ fn (mut c Checker) fn_decl(mut node ast.FnDecl) { node.return_type_pos) } if node.return_type != ast.void_type { + if node.language == .v && node.return_type.clear_option_and_result() == ast.any_type { + c.error('cannot use type `any` here', node.return_type_pos) + } if ct_attr_idx := node.attrs.find_comptime_define() { sexpr := node.attrs[ct_attr_idx].ct_expr.str() c.error('only functions that do NOT return values can have `[if ${sexpr}]` tags', diff --git a/vlib/v/checker/tests/any_return_type_err.out b/vlib/v/checker/tests/any_return_type_err.out new file mode 100644 index 000000000..be724836a --- /dev/null +++ b/vlib/v/checker/tests/any_return_type_err.out @@ -0,0 +1,42 @@ +vlib/v/checker/tests/any_return_type_err.vv:4:19: error: cannot use type `any` here + 2 | } + 3 | + 4 | fn (f Test) abc() any { + | ~~~ + 5 | return 0 + 6 | } +vlib/v/checker/tests/any_return_type_err.vv:8:20: error: cannot use type `any` here + 6 | } + 7 | + 8 | fn (f Test) abc2() ?any { + | ~~~~ + 9 | return 0 + 10 | } +vlib/v/checker/tests/any_return_type_err.vv:12:20: error: cannot use type `any` here + 10 | } + 11 | + 12 | fn (f Test) abc3() !any { + | ~~~~ + 13 | return 0 + 14 | } +vlib/v/checker/tests/any_return_type_err.vv:16:10: error: cannot use type `any` here + 14 | } + 15 | + 16 | fn foo() any { + | ~~~ + 17 | return 3 + 18 | } +vlib/v/checker/tests/any_return_type_err.vv:20:11: error: cannot use type `any` here + 18 | } + 19 | + 20 | fn foo2() ?any { + | ~~~~ + 21 | return 3 + 22 | } +vlib/v/checker/tests/any_return_type_err.vv:24:11: error: cannot use type `any` here + 22 | } + 23 | + 24 | fn foo3() !any { + | ~~~~ + 25 | return 3 + 26 | } diff --git a/vlib/v/checker/tests/any_return_type_err.vv b/vlib/v/checker/tests/any_return_type_err.vv new file mode 100644 index 000000000..baa898d0d --- /dev/null +++ b/vlib/v/checker/tests/any_return_type_err.vv @@ -0,0 +1,30 @@ +struct Test { +} + +fn (f Test) abc() any { + return 0 +} + +fn (f Test) abc2() ?any { + return 0 +} + +fn (f Test) abc3() !any { + return 0 +} + +fn foo() any { + return 3 +} + +fn foo2() ?any { + return 3 +} + +fn foo3() !any { + return 3 +} + +fn main() { + println('any ${foo}') +} -- 2.39.5