From f70e5bd69b4d17e36f32f1bfd73a6f126e6a2552 Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 4 Mar 2022 16:33:14 +0800 Subject: [PATCH] parser: check assign expr with undefined variable (#13653) --- .../tests/assign_expr_undefined_err_m.out | 7 ++++++ .../tests/assign_expr_undefined_err_m.vv | 9 +++++++ .../tests/assign_expr_undefined_err_n.out | 7 ++++++ .../tests/assign_expr_undefined_err_n.vv | 6 +++++ vlib/v/parser/assign.v | 24 +++++++++++++++++++ 5 files changed, 53 insertions(+) create mode 100644 vlib/v/checker/tests/assign_expr_undefined_err_m.out create mode 100644 vlib/v/checker/tests/assign_expr_undefined_err_m.vv create mode 100644 vlib/v/checker/tests/assign_expr_undefined_err_n.out create mode 100644 vlib/v/checker/tests/assign_expr_undefined_err_n.vv diff --git a/vlib/v/checker/tests/assign_expr_undefined_err_m.out b/vlib/v/checker/tests/assign_expr_undefined_err_m.out new file mode 100644 index 0000000000..74165d5c76 --- /dev/null +++ b/vlib/v/checker/tests/assign_expr_undefined_err_m.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/assign_expr_undefined_err_m.vv:5:14: error: undefined variable: `x` + 3 | n := 2 + 4 | x := match a { + 5 | 'add'{ n + x } + | ^ + 6 | else{0} + 7 | } diff --git a/vlib/v/checker/tests/assign_expr_undefined_err_m.vv b/vlib/v/checker/tests/assign_expr_undefined_err_m.vv new file mode 100644 index 0000000000..82dc753a29 --- /dev/null +++ b/vlib/v/checker/tests/assign_expr_undefined_err_m.vv @@ -0,0 +1,9 @@ +fn main(){ + a := 'add' + n := 2 + x := match a { + 'add'{ n + x } + else{0} + } + println(x) +} diff --git a/vlib/v/checker/tests/assign_expr_undefined_err_n.out b/vlib/v/checker/tests/assign_expr_undefined_err_n.out new file mode 100644 index 0000000000..5c4721c580 --- /dev/null +++ b/vlib/v/checker/tests/assign_expr_undefined_err_n.out @@ -0,0 +1,7 @@ +vlib/v/checker/tests/assign_expr_undefined_err_n.vv:4:27: error: undefined variable: `x` + 2 | a := 'add' + 3 | n := 2 + 4 | x := if a == 'add' { n + x } else { 0 } + | ^ + 5 | println(x) + 6 | } diff --git a/vlib/v/checker/tests/assign_expr_undefined_err_n.vv b/vlib/v/checker/tests/assign_expr_undefined_err_n.vv new file mode 100644 index 0000000000..22fc6d9655 --- /dev/null +++ b/vlib/v/checker/tests/assign_expr_undefined_err_n.vv @@ -0,0 +1,6 @@ +fn main(){ + a := 'add' + n := 2 + x := if a == 'add' { n + x } else { 0 } + println(x) +} diff --git a/vlib/v/parser/assign.v b/vlib/v/parser/assign.v index 2daf97a25b..0f6a28726c 100644 --- a/vlib/v/parser/assign.v +++ b/vlib/v/parser/assign.v @@ -63,6 +63,17 @@ fn (mut p Parser) check_undefined_variables(exprs []ast.Expr, val ast.Expr) ? { p.check_undefined_variables(exprs, val.left) ? p.check_undefined_variables(exprs, val.right) ? } + ast.IfExpr { + p.check_undefined_variables(exprs, val.left) ? + for branch in val.branches { + p.check_undefined_variables(exprs, branch.cond) ? + for stmt in branch.stmts { + if stmt is ast.ExprStmt { + p.check_undefined_variables(exprs, stmt.expr) ? + } + } + } + } ast.MapInit { for key in val.keys { p.check_undefined_variables(exprs, key) ? @@ -71,6 +82,19 @@ fn (mut p Parser) check_undefined_variables(exprs []ast.Expr, val ast.Expr) ? { p.check_undefined_variables(exprs, value) ? } } + ast.MatchExpr { + p.check_undefined_variables(exprs, val.cond) ? + for branch in val.branches { + for expr in branch.exprs { + p.check_undefined_variables(exprs, expr) ? + } + for stmt in branch.stmts { + if stmt is ast.ExprStmt { + p.check_undefined_variables(exprs, stmt.expr) ? + } + } + } + } ast.ParExpr { p.check_undefined_variables(exprs, val.expr) ? }