summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--parse.y16
-rw-r--r--test/ruby/test_syntax.rb7
-rw-r--r--version.h2
4 files changed, 24 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 976b1012a7..6eccc8acca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Apr 22 14:48:09 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parse_ident): allow keyword arguments just after a
+ method where the same name local variable is defined.
+ [ruby-core:73816] [Bug#12073]
+
Fri Apr 22 14:34:27 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* eval.c (setup_exception): set the cause only if it is explicitly
diff --git a/parse.y b/parse.y
index 32ca4c8be9..a5da75fa80 100644
--- a/parse.y
+++ b/parse.y
@@ -7589,16 +7589,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)) {
- lex_state = EXPR_END;
- }
+
+ return ident;
}
static int
@@ -7764,6 +7762,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;
@@ -7863,7 +7862,12 @@ parse_ident(struct parser_params *parser, int c, int cmd_state)
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)) {
+ lex_state = EXPR_END|EXPR_LABEL;
+ }
return result;
}
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 6fac862c32..6ddfefc40f 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -340,6 +340,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 812dca45bb..e205c34f02 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.2.5"
#define RUBY_RELEASE_DATE "2016-04-22"
-#define RUBY_PATCHLEVEL 297
+#define RUBY_PATCHLEVEL 298
#define RUBY_RELEASE_YEAR 2016
#define RUBY_RELEASE_MONTH 4