summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--prism/prism.c3
-rw-r--r--test/prism/errors/pattern_match_with_unexpected_splat_inside_arraytxt14
2 files changed, 16 insertions, 1 deletions
diff --git a/prism/prism.c b/prism/prism.c
index db1e475f95..19ff1d2fe6 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -20527,12 +20527,13 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power, b
return (pm_node_t *) node;
}
case PM_TOKEN_UMINUS_NUM: {
+ pm_token_t prev = parser->previous;
parser_lex(parser);
pm_token_t operator = parser->previous;
pm_node_t *node = parse_expression(parser, pm_binding_powers[parser->previous.type].right, false, false, PM_ERR_UNARY_RECEIVER, (uint16_t) (depth + 1));
- if (accept1(parser, PM_TOKEN_STAR_STAR)) {
+ if ((prev.type != PM_TOKEN_BRACKET_LEFT_ARRAY) && (accept1(parser, PM_TOKEN_STAR_STAR))) {
pm_token_t exponent_operator = parser->previous;
pm_node_t *exponent = parse_expression(parser, pm_binding_powers[exponent_operator.type].right, false, false, PM_ERR_EXPECT_ARGUMENT, (uint16_t) (depth + 1));
node = (pm_node_t *) pm_call_node_binary_create(parser, node, &exponent_operator, exponent, 0);
diff --git a/test/prism/errors/pattern_match_with_unexpected_splat_inside_arraytxt b/test/prism/errors/pattern_match_with_unexpected_splat_inside_arraytxt
new file mode 100644
index 0000000000..d19491e6bf
--- /dev/null
+++ b/test/prism/errors/pattern_match_with_unexpected_splat_inside_arraytxt
@@ -0,0 +1,14 @@
+a => [-2*b]
+ ^ expected a `]` to close the pattern expression
+ ^ unexpected '*', expecting end-of-input
+ ^ unexpected '*', ignoring it
+ ^ unexpected ']', expecting end-of-input
+ ^ unexpected ']', ignoring it
+
+a => [-2**b]
+ ^ expected a `]` to close the pattern expression
+ ^~ unexpected '**', expecting end-of-input
+ ^~ unexpected '**', ignoring it
+ ^ unexpected ']', expecting end-of-input
+ ^ unexpected ']', ignoring it
+