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)))