From 733ed1e18498f97250b788f169c37b170e0cf2b6 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Tue, 22 Dec 2020 22:41:54 +0900 Subject: ripper: fix bad label parameter handling [Bug #17425] --- parse.y | 17 ++++++++++++----- test/ripper/test_lexer.rb | 31 ++++++++++++++++--------------- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/parse.y b/parse.y index 477580f181..b3f07c33c2 100644 --- a/parse.y +++ b/parse.y @@ -654,7 +654,11 @@ RUBY_SYMBOL_EXPORT_END static void error_duplicate_pattern_variable(struct parser_params *p, ID id, const YYLTYPE *loc); static void error_duplicate_pattern_key(struct parser_params *p, ID id, const YYLTYPE *loc); static void parser_token_value_print(struct parser_params *p, enum yytokentype type, const YYSTYPE *valp); +#ifndef RIPPER static ID formal_argument(struct parser_params*, ID); +#else +static ID formal_argument(struct parser_params*, VALUE); +#endif static ID shadowing_lvar(struct parser_params*,ID); static void new_bv(struct parser_params*,ID); @@ -5187,7 +5191,7 @@ f_bad_arg : tCONSTANT f_norm_arg : f_bad_arg | tIDENTIFIER { - formal_argument(p, get_id($1)); + formal_argument(p, $1); p->max_numparam = ORDINAL_PARAM; $$ = $1; } @@ -5248,9 +5252,8 @@ f_arg : f_arg_item f_label : tLABEL { - ID id = get_id($1); - arg_var(p, formal_argument(p, id)); - p->cur_arg = id; + arg_var(p, formal_argument(p, $1)); + p->cur_arg = get_id($1); p->max_numparam = ORDINAL_PARAM; $$ = $1; } @@ -7855,9 +7858,13 @@ arg_ambiguous(struct parser_params *p, char c) } static ID +#ifndef RIPPER formal_argument(struct parser_params *p, ID lhs) +#else +formal_argument(struct parser_params *p, VALUE lhs) +#endif { - switch (id_type(lhs)) { + switch (id_type(get_id(lhs))) { case ID_LOCAL: break; #ifndef RIPPER diff --git a/test/ripper/test_lexer.rb b/test/ripper/test_lexer.rb index 910048b28c..f8e751da53 100644 --- a/test/ripper/test_lexer.rb +++ b/test/ripper/test_lexer.rb @@ -146,18 +146,19 @@ class TestRipper::Lexer < Test::Unit::TestCase assert_equal [[1, 17], :on_embexpr_end, "}", state(:EXPR_ARG)], token end - BAD_CODE = { - parse_error: ['def req(true) end', %r[unexpected `true'], 'true'], - assign_error: ['begin; nil = 1; end', %r[assign to nil], 'nil'], - alias_error: ['begin; alias $x $1; end', %r[number variables], '$1'], - class_name_error: ['class bad; end', %r[class/module name], 'bad'], - param_error: ['def req(@a) end', %r[formal argument.*instance], '@a'], - } + BAD_CODE = [ + [:parse_error, 'def req(true) end', %r[unexpected `true'], 'true'], + [:assign_error, 'begin; nil = 1; end', %r[assign to nil], 'nil'], + [:alias_error, 'begin; alias $x $1; end', %r[number variables], '$1'], + [:class_name_error, 'class bad; end', %r[class/module name], 'bad'], + [:param_error, 'def req(@a) end', %r[formal argument.*instance], '@a'], + [:param_error, 'def req(a?:) end', %r[formal argument must.*local], 'a?'], + ] def test_raise_errors_keyword all_assertions do |all| - BAD_CODE.each do |err, (code, message)| - all.for(err) do + BAD_CODE.each do |(err, code, message)| + all.for([err, code]) do assert_raise_with_message(SyntaxError, message) { Ripper.tokenize(code, raise_errors: true) } end end @@ -166,8 +167,8 @@ class TestRipper::Lexer < Test::Unit::TestCase def test_tokenize_with_syntax_error all_assertions do |all| - BAD_CODE.each do |err, (code)| - all.for(err) do + BAD_CODE.each do |(err, code)| + all.for([err, code]) do assert_equal "end", Ripper.tokenize(code).last end end @@ -176,8 +177,8 @@ class TestRipper::Lexer < Test::Unit::TestCase def test_lex_with_syntax_error all_assertions do |all| - BAD_CODE.each do |err, (code)| - all.for(err) do + BAD_CODE.each do |(err, code)| + all.for([err, code]) do assert_equal [[1, code.size-3], :on_kw, "end", state(:EXPR_END)], Ripper.lex(code).last end end @@ -186,8 +187,8 @@ class TestRipper::Lexer < Test::Unit::TestCase def test_lexer_scan_with_syntax_error all_assertions do |all| - BAD_CODE.each do |err, (code, message, token)| - all.for(err) do + BAD_CODE.each do |(err, code, message, token)| + all.for([err, code]) do lexer = Ripper::Lexer.new(code) elems = lexer.scan assert_predicate lexer, :error? -- cgit v1.2.3