[ruby/prism] Reject invalid operator after match predicate or after match required
Partially fixes: #3171 https://github.com/ruby/prism/commit/d0d9699c27
This commit is contained in:
parent
2ba5987263
commit
fd217d475d
@ -21416,6 +21416,33 @@ parse_expression_infix(pm_parser_t *parser, pm_node_t *node, pm_binding_power_t
|
|||||||
case PM_TOKEN_STAR:
|
case PM_TOKEN_STAR:
|
||||||
case PM_TOKEN_STAR_STAR: {
|
case PM_TOKEN_STAR_STAR: {
|
||||||
parser_lex(parser);
|
parser_lex(parser);
|
||||||
|
pm_token_t operator = parser->previous;
|
||||||
|
switch (PM_NODE_TYPE(node)) {
|
||||||
|
case PM_RESCUE_MODIFIER_NODE: {
|
||||||
|
pm_rescue_modifier_node_t *cast = (pm_rescue_modifier_node_t *) node;
|
||||||
|
if (PM_NODE_TYPE_P(cast->rescue_expression, PM_MATCH_PREDICATE_NODE) || PM_NODE_TYPE_P(cast->rescue_expression, PM_MATCH_REQUIRED_NODE)) {
|
||||||
|
PM_PARSER_ERR_TOKEN_FORMAT(parser, operator, PM_ERR_EXPECT_EOL_AFTER_STATEMENT, pm_token_type_human(operator.type));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PM_AND_NODE: {
|
||||||
|
pm_and_node_t *cast = (pm_and_node_t *) node;
|
||||||
|
if (PM_NODE_TYPE_P(cast->right, PM_MATCH_PREDICATE_NODE) || PM_NODE_TYPE_P(cast->right, PM_MATCH_REQUIRED_NODE)) {
|
||||||
|
PM_PARSER_ERR_TOKEN_FORMAT(parser, operator, PM_ERR_EXPECT_EOL_AFTER_STATEMENT, pm_token_type_human(operator.type));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case PM_OR_NODE: {
|
||||||
|
pm_or_node_t *cast = (pm_or_node_t *) node;
|
||||||
|
if (PM_NODE_TYPE_P(cast->right, PM_MATCH_PREDICATE_NODE) || PM_NODE_TYPE_P(cast->right, PM_MATCH_REQUIRED_NODE)) {
|
||||||
|
PM_PARSER_ERR_TOKEN_FORMAT(parser, operator, PM_ERR_EXPECT_EOL_AFTER_STATEMENT, pm_token_type_human(operator.type));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
pm_node_t *argument = parse_expression(parser, binding_power, false, false, PM_ERR_EXPECT_EXPRESSION_AFTER_OPERATOR, (uint16_t) (depth + 1));
|
||||||
return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, 0);
|
return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, 0);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
1 and 2 in 3 % 4
|
||||||
|
^ unexpected '%', expecting end-of-input
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
1 or 2 in 3 + 4
|
||||||
|
^ unexpected '+', expecting end-of-input
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
1 rescue 2 in 3 << 4
|
||||||
|
^~ unexpected <<, expecting end-of-input
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
1 and 2 => 3 - 4
|
||||||
|
^ unexpected '-', expecting end-of-input
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
1 or 2 => 3 ^ 4
|
||||||
|
^ unexpected '^', expecting end-of-input
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
1 rescue 2 => 3 ** 4
|
||||||
|
^~ unexpected '**', expecting end-of-input
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user