diff options
author | TSUYUSATO Kitsune <make.just.on@gmail.com> | 2023-12-04 13:00:41 +0900 |
---|---|---|
committer | git <svn-admin@ruby-lang.org> | 2023-12-04 14:00:23 +0000 |
commit | 2a65d8370702b3f2a5db21b65f21ccef6f0b503b (patch) | |
tree | bebeadb72c43f171a70b7d745a722e23037a3d36 | |
parent | 85bc80a51be0ceedcc57e7b6b779e6f8f885859e (diff) | |
download | ruby-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.c | 6 | ||||
-rw-r--r-- | test/prism/errors_test.rb | 22 |
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 } |