summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-17 01:22:26 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-17 01:22:26 +0000
commitf168dbd9ef3d27ec629d323f8a0834d63b5d7baa (patch)
tree92a52b64fe4beb45c51cbb4bc763888f9fcdf40a
parent58a2084483ce8baaf90d7b1cb00e3fa9570fbc79 (diff)
parse.y: fix cmdarg in command_args
* parse.y (call_args): fix invalid CMDARG state after command_args followed by tLBRACE_ARG. [ruby-core:86551] [Bug #14690] From: Ilya Bylich <ibylich@gmail.com> git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63168 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--parse.y13
-rw-r--r--test/ruby/test_parse.rb4
2 files changed, 17 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index 21cb2884f7..655cd85031 100644
--- a/parse.y
+++ b/parse.y
@@ -2170,7 +2170,20 @@ command_args : {
}
call_args
{
+ /* call_args can be followed by tLBRACE_ARG (that does CMDARG_PUSH(0) in the lexer)
+ * but the push must be done after CMDARG_POP() in the parser.
+ * So this code does CMDARG_POP() to pop 0 pushed by tLBRACE_ARG,
+ * CMDARG_POP() to pop 1 pushed by command_args,
+ * and CMDARG_PUSH(0) to restore back the flag set by tLBRACE_ARG.
+ */
+ int lookahead = 0;
+ switch (yychar) {
+ case tLBRACE_ARG:
+ lookahead = 1;
+ }
+ if (lookahead) CMDARG_POP();
CMDARG_POP();
+ if (lookahead) CMDARG_PUSH(0);
$$ = $2;
}
;
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index b05dbe2a0f..6160aa1452 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -1196,6 +1196,10 @@ x = __ENCODING__
end
end
+ def test_cdmarg_after_command_args_and_tlbrace_arg
+ assert_valid_syntax('let () { m(a) do; end }')
+ end
+
=begin
def test_past_scope_variable
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}