summaryrefslogtreecommitdiff
path: root/prism/prism.c
diff options
context:
space:
mode:
authorydah <[email protected]>2024-11-27 19:31:29 +0900
committergit <[email protected]>2024-12-02 18:42:16 +0000
commitfd217d475d885d02e526deef644d552cdec28b13 (patch)
tree6e661bc2d4a5c7a5c7fd7d6104fda2c1c9ff9dd3 /prism/prism.c
parent2ba598726360226b5a00d7c72a62479c6eb0e87a (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.c27
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);
}