From d62c4c9fc1b257a5bb2ff0e78825b130a8cf65ef Mon Sep 17 00:00:00 2001 From: Felipe Pena Date: Wed, 10 May 2023 12:30:57 -0300 Subject: [PATCH] checker: add missing check for global var on assignment to shared var (#18125) --- vlib/v/checker/assign.v | 7 +++++++ .../tests/globals/assign_global_to_shared_err.out | 12 ++++++++++++ .../tests/globals/assign_global_to_shared_err.vv | 6 ++++++ 3 files changed, 25 insertions(+) create mode 100644 vlib/v/checker/tests/globals/assign_global_to_shared_err.out create mode 100644 vlib/v/checker/tests/globals/assign_global_to_shared_err.vv diff --git a/vlib/v/checker/assign.v b/vlib/v/checker/assign.v index 3553cba664..bbdaa4c8e3 100644 --- a/vlib/v/checker/assign.v +++ b/vlib/v/checker/assign.v @@ -221,6 +221,13 @@ fn (mut c Checker) assign_stmt(mut node ast.AssignStmt) { // c.error('cannot assign a `none` value to a non-option variable', right.pos()) // } } + if mut left is ast.Ident + && (left as ast.Ident).info is ast.IdentVar && right is ast.Ident && (right as ast.Ident).name in c.global_names { + ident_var_info := left.info as ast.IdentVar + if ident_var_info.share == .shared_t { + c.error('cannot assign global variable to shared variable', right.pos()) + } + } if right_type.is_ptr() && left_type.is_ptr() { if mut right is ast.Ident { if mut right.obj is ast.Var { diff --git a/vlib/v/checker/tests/globals/assign_global_to_shared_err.out b/vlib/v/checker/tests/globals/assign_global_to_shared_err.out new file mode 100644 index 0000000000..8d4a0839ca --- /dev/null +++ b/vlib/v/checker/tests/globals/assign_global_to_shared_err.out @@ -0,0 +1,12 @@ +vlib/v/checker/tests/globals/assign_global_to_shared_err.vv:5:9: warning: unused variable: `b` + 3 | + 4 | fn main() { + 5 | shared b := a + | ^ + 6 | } +vlib/v/checker/tests/globals/assign_global_to_shared_err.vv:5:14: error: cannot assign global variable to shared variable + 3 | + 4 | fn main() { + 5 | shared b := a + | ^ + 6 | } diff --git a/vlib/v/checker/tests/globals/assign_global_to_shared_err.vv b/vlib/v/checker/tests/globals/assign_global_to_shared_err.vv new file mode 100644 index 0000000000..e6acc1ae24 --- /dev/null +++ b/vlib/v/checker/tests/globals/assign_global_to_shared_err.vv @@ -0,0 +1,6 @@ +[has_globals] +__global a = 0 + +fn main() { + shared b := a +}