summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--parse.y5
-rw-r--r--test/ruby/test_keyword.rb9
3 files changed, 18 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index a65c66a3ce..36ce0a0617 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Mar 25 23:57:17 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): only a newline after label should be
+ significant. [ruby-core:61658] [Bug #9669]
+
Tue Mar 25 23:32:25 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
* ext/pathname/lib/pathname.rb (Pathname#join): remove unnecessary
diff --git a/parse.y b/parse.y
index b3bbef1a51..aab0e40ebd 100644
--- a/parse.y
+++ b/parse.y
@@ -7017,13 +7017,16 @@ parser_yylex(struct parser_params *parser)
#endif
/* fall through */
case '\n':
- if (IS_lex_state(EXPR_BEG | EXPR_VALUE | EXPR_CLASS | EXPR_FNAME | EXPR_DOT)) {
+ if (IS_lex_state(EXPR_BEG | EXPR_VALUE | EXPR_CLASS | EXPR_FNAME | EXPR_DOT | EXPR_LABELARG)) {
#ifdef RIPPER
if (!fallthru) {
ripper_dispatch_scan_event(parser, tIGNORED_NL);
}
fallthru = FALSE;
#endif
+ if (IS_lex_state(EXPR_LABELARG) && parser->parser_in_kwarg) {
+ goto normal_newline;
+ }
goto retry;
}
while ((c = nextc())) {
diff --git a/test/ruby/test_keyword.rb b/test/ruby/test_keyword.rb
index 75b8f58a98..31830dfb2f 100644
--- a/test/ruby/test_keyword.rb
+++ b/test/ruby/test_keyword.rb
@@ -335,6 +335,15 @@ class TestKeywordArguments < Test::Unit::TestCase
end;
end
assert_equal(42, bug9669.foo(a: 42))
+ assert_nothing_raised(SyntaxError, bug9669) do
+ eval(<<-'end;', nil, __FILE__, __LINE__)
+ o = {
+ a:
+ 1
+ }
+ end;
+ end
+ assert_equal({a: 1}, o, bug9669)
end
def test_block_required_keyword