summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-23 08:59:07 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-07-23 08:59:07 +0000
commitfd2fca8395ac1ac2c854005cf765693a00e5f545 (patch)
treecf85bff01a8b09fc319e960d68997e32673e96ab
parente7358e6063f525b654c5e1ce80003dd02eb86b7a (diff)
merge revision(s) 58641: [Backport #13547]
parse.y: brace after literal arg * parse.y (symbol, dsym, parser_set_number_literal, parser_yylex): set state to END too not only ENDARG and after a literal, so that a left brace after it should be a primary block bound to the literal, which causes syntax error. [ruby-core:81037] [Bug #13547] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_4@59409 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--parse.y10
-rw-r--r--test/ruby/test_syntax.rb10
-rw-r--r--version.h2
3 files changed, 17 insertions, 5 deletions
diff --git a/parse.y b/parse.y
index 43d7cc4a31..13823c42ee 100644
--- a/parse.y
+++ b/parse.y
@@ -4254,7 +4254,7 @@ string_dvar : tGVAR
symbol : tSYMBEG sym
{
- SET_LEX_STATE(EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
/*%%%*/
$$ = $2;
/*%
@@ -4271,7 +4271,7 @@ sym : fname
dsym : tSYMBEG xstring_contents tSTRING_END
{
- SET_LEX_STATE(EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
/*%%%*/
$$ = dsym_node($2);
/*%
@@ -6659,7 +6659,7 @@ parser_set_number_literal(struct parser_params *parser, VALUE v, int type, int s
type = tIMAGINARY;
}
set_yylval_literal(v);
- SET_LEX_STATE(EXPR_ENDARG);
+ SET_LEX_STATE(EXPR_END|EXPR_ENDARG);
return type;
}
@@ -8017,9 +8017,11 @@ parser_yylex(struct parser_params *parser)
}
}
if (token == tSTRING_END || token == tREGEXP_END || token == tLABEL_END) {
+ const enum lex_state_e next_state =
+ token == tLABEL_END ? EXPR_BEG|EXPR_LABEL : EXPR_END|EXPR_ENDARG;
rb_gc_force_recycle((VALUE)lex_strterm);
lex_strterm = 0;
- SET_LEX_STATE(token == tLABEL_END ? EXPR_BEG|EXPR_LABEL : EXPR_ENDARG);
+ SET_LEX_STATE(next_state);
}
}
return token;
diff --git a/test/ruby/test_syntax.rb b/test/ruby/test_syntax.rb
index 7742dd239a..4b9101bc7b 100644
--- a/test/ruby/test_syntax.rb
+++ b/test/ruby/test_syntax.rb
@@ -952,6 +952,16 @@ eom
assert_equal(:ok, result)
end
+ def test_brace_after_literal_argument
+ bug = '[ruby-core:81037] [Bug #13547]'
+ error = /unexpected '{'/
+ assert_syntax_error('m "x" {}', error)
+ assert_syntax_error('m 1 {}', error, bug)
+ assert_syntax_error('m 1.0 {}', error, bug)
+ assert_syntax_error('m :m {}', error, bug)
+ assert_syntax_error('m :"#{m}" {}', error, bug)
+ end
+
def test_return_toplevel
feature4840 = '[ruby-core:36785] [Feature #4840]'
code = "#{<<~"begin;"}\n#{<<~"end;"}"
diff --git a/version.h b/version.h
index d6acc76d91..b85de7a548 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.4.2"
#define RUBY_RELEASE_DATE "2017-07-23"
-#define RUBY_PATCHLEVEL 160
+#define RUBY_PATCHLEVEL 161
#define RUBY_RELEASE_YEAR 2017
#define RUBY_RELEASE_MONTH 7