Commit b1669798 authored by Nobuyoshi Nakada's avatar Nobuyoshi Nakada

Allow parenthesed do-block in cmdarg

Flush cmdarg flags inside left-paren in a command argument, to allow
parenthesed `do-block` as an argument without arguments parentheses.
`CMDARG_PUSH(0)` for tLPAREN_ARG is before `CMDARG_PUSH(1)` in
`command_args` due to look-ahead.
parent 426f80b1
...@@ -2039,9 +2039,15 @@ primary : literal ...@@ -2039,9 +2039,15 @@ primary : literal
p->cmdarg_stack = $<stack>1; p->cmdarg_stack = $<stack>1;
$$ = $3; $$ = $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 | tLPAREN_ARG {p->lstate = EXPR_ENDARG;} rparen
{ {
......
...@@ -254,3 +254,14 @@ assert('External command execution.') do ...@@ -254,3 +254,14 @@ assert('External command execution.') do
end end
true true
end 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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment