From 11784279ba5132a7e44c588105479a61dbd8ecae Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 5 Aug 2021 02:23:22 +0800 Subject: [PATCH] checker: check fn_call().sort() (fix #11040) (#11056) --- vlib/v/checker/checker.v | 4 ++++ vlib/v/checker/tests/fn_return_array_sort_err.out | 6 ++++++ vlib/v/checker/tests/fn_return_array_sort_err.vv | 7 +++++++ 3 files changed, 17 insertions(+) create mode 100644 vlib/v/checker/tests/fn_return_array_sort_err.out create mode 100644 vlib/v/checker/tests/fn_return_array_sort_err.vv diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 9d2bdeead3..65fe56956e 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2465,6 +2465,10 @@ fn (mut c Checker) array_builtin_method_call(mut call_expr ast.CallExpr, left_ty // position of `it` doesn't matter scope_register_it(mut call_expr.scope, call_expr.pos, elem_typ) } else if method_name == 'sort' { + if call_expr.left is ast.CallExpr { + c.error('the `sort()` method can be called only on mutable receivers, but `$call_expr.left` is a call expression', + call_expr.pos) + } c.fail_if_immutable(call_expr.left) // position of `a` and `b` doesn't matter, they're the same scope_register_a_b(mut call_expr.scope, call_expr.pos, elem_typ) diff --git a/vlib/v/checker/tests/fn_return_array_sort_err.out b/vlib/v/checker/tests/fn_return_array_sort_err.out new file mode 100644 index 0000000000..d15d93706d --- /dev/null +++ b/vlib/v/checker/tests/fn_return_array_sort_err.out @@ -0,0 +1,6 @@ +vlib/v/checker/tests/fn_return_array_sort_err.vv:6:14: error: the `sort()` method can be called only on mutable receivers, but `ret_array()` is a call expression + 4 | + 5 | fn main() { + 6 | ret_array().sort() + | ~~~~~~ + 7 | } diff --git a/vlib/v/checker/tests/fn_return_array_sort_err.vv b/vlib/v/checker/tests/fn_return_array_sort_err.vv new file mode 100644 index 0000000000..3d28f79e0c --- /dev/null +++ b/vlib/v/checker/tests/fn_return_array_sort_err.vv @@ -0,0 +1,7 @@ +fn ret_array() []int { + return [1, 3, 2] +} + +fn main() { + ret_array().sort() +}