summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/parse.y10
-rw-r--r--test/t/syntax.rb11
2 files changed, 19 insertions, 2 deletions
diff --git a/src/parse.y b/src/parse.y
index 345ac5756..053b5f3e9 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -2039,9 +2039,15 @@ primary : literal
p->cmdarg_stack = $<stack>1;
$$ = $3;
}
- | tLPAREN_ARG expr {p->lstate = EXPR_ENDARG;} rparen
+ | tLPAREN_ARG
{
- $$ = $2;
+ $<stack>1 = p->cmdarg_stack;
+ p->cmdarg_stack = 0;
+ }
+ expr {p->lstate = EXPR_ENDARG;} rparen
+ {
+ p->cmdarg_stack = $<stack>1;
+ $$ = $3;
}
| tLPAREN_ARG {p->lstate = EXPR_ENDARG;} rparen
{
diff --git a/test/t/syntax.rb b/test/t/syntax.rb
index fac73aa7b..d761b1991 100644
--- a/test/t/syntax.rb
+++ b/test/t/syntax.rb
@@ -254,3 +254,14 @@ assert('External command execution.') do
end
true
end
+
+assert('parenthesed do-block in cmdarg') do
+ class ParenDoBlockCmdArg
+ def test(block)
+ block.call
+ end
+ end
+ x = ParenDoBlockCmdArg.new
+ result = x.test (proc do :ok; end)
+ assert_equal :ok, result
+end