From e2334d8b62ab49b338e1f1f58973fbd3e575eebf Mon Sep 17 00:00:00 2001 From: shove Date: Fri, 5 Jan 2024 18:22:08 +0800 Subject: [PATCH] parser: fix checking for invalid PrefixExpr (fix #20388) (#20392) --- vlib/v/parser/expr.v | 10 ++++++++++ vlib/v/parser/tests/prefix_err_1.out | 3 +++ vlib/v/parser/tests/prefix_err_1.vv | 1 + vlib/v/parser/tests/prefix_err_2.out | 3 +++ vlib/v/parser/tests/prefix_err_2.vv | 1 + 5 files changed, 18 insertions(+) create mode 100644 vlib/v/parser/tests/prefix_err_1.out create mode 100644 vlib/v/parser/tests/prefix_err_1.vv create mode 100644 vlib/v/parser/tests/prefix_err_2.out create mode 100644 vlib/v/parser/tests/prefix_err_2.vv diff --git a/vlib/v/parser/expr.v b/vlib/v/parser/expr.v index 08503b01c7..d82130d227 100644 --- a/vlib/v/parser/expr.v +++ b/vlib/v/parser/expr.v @@ -666,7 +666,17 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr { p.inside_in_array = true } + right_op_pos := p.tok.pos() right = p.expr(precedence) + if op in [.plus, .minus, .mul, .div, .mod, .lt, .eq] && mut right is ast.PrefixExpr { + mut right_expr := right.right + for mut right_expr is ast.ParExpr { + right_expr = right_expr.expr + } + if right.op in [.plus, .minus, .mul, .div, .mod, .lt, .eq] && right_expr.is_pure_literal() { + p.error_with_pos('invalid expression: unexpected token `${op}`', right_op_pos) + } + } if is_key_in { p.inside_in_array = false } diff --git a/vlib/v/parser/tests/prefix_err_1.out b/vlib/v/parser/tests/prefix_err_1.out new file mode 100644 index 0000000000..974bf684f1 --- /dev/null +++ b/vlib/v/parser/tests/prefix_err_1.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/prefix_err_1.vv:1:9: error: invalid expression: unexpected token `-` + 1 | _ = 5 - - -5 + | ^ diff --git a/vlib/v/parser/tests/prefix_err_1.vv b/vlib/v/parser/tests/prefix_err_1.vv new file mode 100644 index 0000000000..04f48354be --- /dev/null +++ b/vlib/v/parser/tests/prefix_err_1.vv @@ -0,0 +1 @@ +_ = 5 - - -5 diff --git a/vlib/v/parser/tests/prefix_err_2.out b/vlib/v/parser/tests/prefix_err_2.out new file mode 100644 index 0000000000..65d09ba0d7 --- /dev/null +++ b/vlib/v/parser/tests/prefix_err_2.out @@ -0,0 +1,3 @@ +vlib/v/parser/tests/prefix_err_2.vv:1:9: error: invalid expression: unexpected token `-` + 1 | _ = 5 - - (((-5))) + | ^ diff --git a/vlib/v/parser/tests/prefix_err_2.vv b/vlib/v/parser/tests/prefix_err_2.vv new file mode 100644 index 0000000000..74edf5d7e0 --- /dev/null +++ b/vlib/v/parser/tests/prefix_err_2.vv @@ -0,0 +1 @@ +_ = 5 - - (((-5)))