aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTSUYUSATO Kitsune <make.just.on@gmail.com>2023-12-04 13:00:41 +0900
committergit <svn-admin@ruby-lang.org>2023-12-04 14:00:23 +0000
commit2a65d8370702b3f2a5db21b65f21ccef6f0b503b (patch)
treebebeadb72c43f171a70b7d745a722e23037a3d36
parent85bc80a51be0ceedcc57e7b6b779e6f8f885859e (diff)
downloadruby-2a65d8370702b3f2a5db21b65f21ccef6f0b503b.tar.gz
[ruby/prism] Check "void value expression" for array literals
Fix https://github.com/ruby/prism/pull/1978 https://github.com/ruby/prism/commit/194c997d0a
-rw-r--r--prism/prism.c6
-rw-r--r--test/prism/errors_test.rb22
2 files changed, 25 insertions, 3 deletions
diff --git a/prism/prism.c b/prism/prism.c
index 9021f5b0f8..651a632079 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -13666,7 +13666,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
pm_parser_err_token(parser, &operator, PM_ERR_ARGUMENT_NO_FORWARDING_STAR);
}
} else {
- expression = parse_expression(parser, PM_BINDING_POWER_DEFINED, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR);
+ expression = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, PM_ERR_ARRAY_EXPRESSION_AFTER_STAR);
}
element = (pm_node_t *) pm_splat_node_create(parser, &operator, expression);
@@ -13684,7 +13684,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
parsed_bare_hash = true;
} else {
- element = parse_expression(parser, PM_BINDING_POWER_DEFINED, PM_ERR_ARRAY_EXPRESSION);
+ element = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, PM_ERR_ARRAY_EXPRESSION);
if (pm_symbol_node_label_p(element) || accept1(parser, PM_TOKEN_EQUAL_GREATER)) {
if (parsed_bare_hash) {
@@ -13700,7 +13700,7 @@ parse_expression_prefix(pm_parser_t *parser, pm_binding_power_t binding_power) {
operator = not_provided(parser);
}
- pm_node_t *value = parse_expression(parser, PM_BINDING_POWER_DEFINED, PM_ERR_HASH_VALUE);
+ pm_node_t *value = parse_value_expression(parser, PM_BINDING_POWER_DEFINED, PM_ERR_HASH_VALUE);
pm_node_t *assoc = (pm_node_t *) pm_assoc_node_create(parser, element, &operator, value);
pm_keyword_hash_node_elements_append(hash, assoc);
diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb
index a7683aa430..df41da493a 100644
--- a/test/prism/errors_test.rb
+++ b/test/prism/errors_test.rb
@@ -1660,6 +1660,28 @@ module Prism
], compare_ripper: false # Ripper does not check 'void value expression'.
end
+ def test_void_value_expression_in_array
+ source = <<~RUBY
+ [return]
+ [1, return]
+ [ return => 1 ]
+ [ 1 => return ]
+ [ a: return ]
+ [ *return ]
+ [ **return ]
+ RUBY
+ message = 'unexpected void value expression'
+ assert_errors expression(source), source, [
+ [message, 1..7],
+ [message, 13..19],
+ [message, 23..29],
+ [message, 44..50],
+ [message, 58..64],
+ [message, 70..76],
+ [message, 83..89],
+ ], compare_ripper: false # Ripper does not check 'void value expression'.
+ end
+
def test_void_value_expression_in_hash
source = <<~RUBY
{ return => 1 }