diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-12-22 22:41:54 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-12-23 09:56:35 +0900 |
commit | 733ed1e18498f97250b788f169c37b170e0cf2b6 (patch) | |
tree | 66fa00ab814b6371e731cb2458c9fe6fd0088bcb | |
parent | cd63f0358ffb43890d20bb5612c5d82be19fae62 (diff) | |
download | ruby-733ed1e18498f97250b788f169c37b170e0cf2b6.tar.gz |
ripper: fix bad label parameter handling [Bug #17425]
-rw-r--r-- | parse.y | 17 | ||||
-rw-r--r-- | test/ripper/test_lexer.rb | 31 |
2 files changed, 28 insertions, 20 deletions
@@ -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? |