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 = $1; $$ = $3; } - | tLPAREN_ARG expr {p->lstate = EXPR_ENDARG;} rparen + | tLPAREN_ARG { - $$ = $2; + $1 = p->cmdarg_stack; + p->cmdarg_stack = 0; + } + expr {p->lstate = EXPR_ENDARG;} rparen + { + p->cmdarg_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