From fb9795cf7a25d675d1fd525997fd002a16f46aec Mon Sep 17 00:00:00 2001 From: Haldun Bayhantopcu Date: Thu, 5 Oct 2023 08:15:23 +0200 Subject: [ruby/prism] Fix parsing shadow args in lambda blocks https://github.com/ruby/prism/commit/53efaf252d --- prism/prism.c | 2 +- test/prism/errors_test.rb | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/prism/prism.c b/prism/prism.c index e922e18f31..c84092ea68 100644 --- a/prism/prism.c +++ b/prism/prism.c @@ -9782,7 +9782,7 @@ parse_block_parameters( } pm_block_parameters_node_t *block_parameters = pm_block_parameters_node_create(parser, parameters, opening); - if (accept1(parser, PM_TOKEN_SEMICOLON)) { + if ((opening->type != PM_TOKEN_NOT_PROVIDED) && accept1(parser, PM_TOKEN_SEMICOLON)) { do { expect1(parser, PM_TOKEN_IDENTIFIER, PM_ERR_BLOCK_PARAM_LOCAL_VARIABLE); pm_parser_local_add_token(parser, &parser->previous); diff --git a/test/prism/errors_test.rb b/test/prism/errors_test.rb index 399653ef3e..cb58b3cd21 100644 --- a/test/prism/errors_test.rb +++ b/test/prism/errors_test.rb @@ -1363,6 +1363,16 @@ module Prism ] end + def test_shadow_args_in_lambda + source = "->a;b{}" + assert_errors expression(source), source, [ + ["Expected a `do` keyword or a `{` to open the lambda block", 3..3], + ["Expected a newline or semicolon after the statement", 7..7], + ["Cannot parse the expression", 7..7], + ["Expected a lambda block beginning with `do` to end with `end`", 7..7], + ] + end + private def assert_errors(expected, source, errors, compare_ripper: RUBY_ENGINE == "ruby") -- cgit v1.2.3