diff options
author | ydah <[email protected]> | 2024-11-27 19:31:29 +0900 |
---|---|---|
committer | git <[email protected]> | 2024-12-02 18:42:16 +0000 |
commit | fd217d475d885d02e526deef644d552cdec28b13 (patch) | |
tree | 6e661bc2d4a5c7a5c7fd7d6104fda2c1c9ff9dd3 /prism/prism.c | |
parent | 2ba598726360226b5a00d7c72a62479c6eb0e87a (diff) |
[ruby/prism] Reject invalid operator after match predicate or after match required
Partially fixes: #3171
https://github.com/ruby/prism/commit/d0d9699c27
Diffstat (limited to 'prism/prism.c')
-rw-r--r-- | prism/prism.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/prism/prism.c b/prism/prism.c index 4cf453dbdf..01e92aa817 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -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_STAR: { 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)); return (pm_node_t *) pm_call_node_binary_create(parser, node, &token, argument, 0); } |