From b118f5d82f9d23f388ff951dd0574bb18d7cf18a Mon Sep 17 00:00:00 2001 From: nagachika Date: Sat, 16 Apr 2016 19:43:02 +0000 Subject: merge revision(s) 53834,53835,53836: [Backport #12073] parse.y: simplify local ID condition * parse.y (tokenize_ident, parse_ident): ident in tokenize_ident() can be a local id only when called from parse_ident(), but never from parse_gvar() and parse_atmark(). * parse.y (parse_ident): allow keyword arguments just after a method where the same name local variable is defined. [ruby-core:73816] [Bug#12073] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_3@54618 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ parse.y | 16 ++++++++++------ test/ruby/test_syntax.rb | 7 +++++++ version.h | 2 +- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index 39336b7ef5..883ed4bf12 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Sun Apr 17 04:30:13 2016 Nobuyoshi Nakada + + * parse.y (parse_ident): allow keyword arguments just after a + method where the same name local variable is defined. + [ruby-core:73816] [Bug#12073] + Sun Apr 17 04:20:40 2016 Nobuyoshi Nakada * eval.c (setup_exception): set the cause only if it is explicitly diff --git a/parse.y b/parse.y index 17a24e4aea..0ffcaf68d9 100644 --- a/parse.y +++ b/parse.y @@ -7823,16 +7823,14 @@ tokadd_ident(struct parser_params *parser, int c) return 0; } -static void +static ID tokenize_ident(struct parser_params *parser, const enum lex_state_e last_state) { ID ident = TOK_INTERN(); set_yylval_name(ident); - if (!IS_lex_state_for(last_state, EXPR_DOT|EXPR_FNAME) && - is_local_id(ident) && lvar_defined(ident)) { - SET_LEX_STATE(EXPR_END); - } + + return ident; } static int @@ -8003,6 +8001,7 @@ parse_ident(struct parser_params *parser, int c, int cmd_state) int result = 0; int mb = ENC_CODERANGE_7BIT; const enum lex_state_e last_state = lex_state; + ID ident; do { if (!ISASCII(c)) mb = ENC_CODERANGE_UNKNOWN; @@ -8102,7 +8101,12 @@ parse_ident(struct parser_params *parser, int c, int cmd_state) SET_LEX_STATE(EXPR_END); } - tokenize_ident(parser, last_state); + ident = tokenize_ident(parser, last_state); + if (!IS_lex_state_for(last_state, EXPR_DOT|EXPR_FNAME) && + (result == tIDENTIFIER) && /* not EXPR_FNAME, not attrasgn */ + lvar_defined(ident)) { + SET_LEX_STATE(EXPR_END|EXPR_LABEL); + } return result; } diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb index 70b3934d4f..9f3bd0dab3 100644 --- a/test/ruby/test_syntax.rb +++ b/test/ruby/test_syntax.rb @@ -360,6 +360,13 @@ WARN assert_valid_syntax("{label: <<~DOC\n""DOC\n""}", bug11849) end + def test_cmdarg_kwarg_lvar_clashing_method + bug12073 = '[ruby-core:73816] [Bug#12073]' + a = 1 + assert_valid_syntax("a b: 1") + assert_valid_syntax("a = 1; a b: 1", bug12073) + end + def test_duplicated_arg assert_syntax_error("def foo(a, a) end", /duplicated argument name/) assert_nothing_raised { def foo(_, _) end } diff --git a/version.h b/version.h index 6a485c9ca7..b797a8c094 100644 --- a/version.h +++ b/version.h @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.3.0" #define RUBY_RELEASE_DATE "2016-04-17" -#define RUBY_PATCHLEVEL 84 +#define RUBY_PATCHLEVEL 85 #define RUBY_RELEASE_YEAR 2016 #define RUBY_RELEASE_MONTH 4 -- cgit v1.2.3