From 638f0f69eda924c1478902a583703bae56e6803a Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Tue, 2 May 2023 09:52:40 -0300 Subject: [PATCH] checker: fix wrong error message about missing `shared` on parameter signature (fix #18087) (#18091) --- vlib/v/checker/fn.v | 6 ++--- vlib/v/checker/tests/shared_param_err.out | 14 +++++++++++ vlib/v/checker/tests/shared_param_err.vv | 29 +++++++++++++++++++++++ 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 vlib/v/checker/tests/shared_param_err.out create mode 100644 vlib/v/checker/tests/shared_param_err.vv diff --git a/vlib/v/checker/fn.v b/vlib/v/checker/fn.v index 3cbc1edd1..c72fe9bf5 100644 --- a/vlib/v/checker/fn.v +++ b/vlib/v/checker/fn.v @@ -1086,7 +1086,7 @@ fn (mut c Checker) fn_call(mut node ast.CallExpr, mut continue_check &bool) ast. } } else { if param.is_mut { - tok := call_arg.share.str() + tok := if param.typ.has_flag(.shared_f) { 'shared' } else { call_arg.share.str() } c.error('function `${node.name}` parameter `${param.name}` is `${tok}`, so use `${tok} ${call_arg.expr}` instead', call_arg.expr.pos()) } else { @@ -1805,7 +1805,7 @@ fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type { } } else { if param_is_mut { - tok := arg.share.str() + tok := if param.typ.has_flag(.shared_f) { 'shared' } else { arg.share.str() } c.error('method `${node.name}` parameter `${param.name}` is `${tok}`, so use `${tok} ${arg.expr}` instead', arg.expr.pos()) } else { @@ -2056,7 +2056,7 @@ fn (mut c Checker) method_call(mut node ast.CallExpr) ast.Type { } } else { if param.is_mut { - tok := arg.share.str() + tok := if param.typ.has_flag(.shared_f) { 'shared' } else { arg.share.str() } c.error('method `${node.name}` parameter ${i + 1} is `${tok}`, so use `${tok} ${arg.expr}` instead', arg.expr.pos()) } else { diff --git a/vlib/v/checker/tests/shared_param_err.out b/vlib/v/checker/tests/shared_param_err.out new file mode 100644 index 000000000..70bf5eb5f --- /dev/null +++ b/vlib/v/checker/tests/shared_param_err.out @@ -0,0 +1,14 @@ +vlib/v/checker/tests/shared_param_err.vv:23:12: error: method `g` parameter `c` is `shared`, so use `shared a` instead + 21 | x: 10 + 22 | } + 23 | spawn a.g(a) + | ^ + 24 | spawn foo(a) + 25 | +vlib/v/checker/tests/shared_param_err.vv:24:12: error: function `foo` parameter `b` is `shared`, so use `shared a` instead + 22 | } + 23 | spawn a.g(a) + 24 | spawn foo(a) + | ^ + 25 | + 26 | rlock a { diff --git a/vlib/v/checker/tests/shared_param_err.vv b/vlib/v/checker/tests/shared_param_err.vv new file mode 100644 index 000000000..da587b990 --- /dev/null +++ b/vlib/v/checker/tests/shared_param_err.vv @@ -0,0 +1,29 @@ +struct St { +mut: + x int + // data to be shared +} + +fn (shared b St) g(shared c St) { + lock b { + b.x = 100 + } +} + +fn foo(shared b St) { + lock b { + b.x = 101 + } +} + +fn main() { + shared a := St{ + x: 10 + } + spawn a.g(a) + spawn foo(a) + + rlock a { + println(a.x) + } +} -- 2.39.5