diff --git a/compilers/opsc/src/Ops/Compiler/Actions.pm b/compilers/opsc/src/Ops/Compiler/Actions.pm index 6103e882ed..158bfdfb0f 100644 --- a/compilers/opsc/src/Ops/Compiler/Actions.pm +++ b/compilers/opsc/src/Ops/Compiler/Actions.pm @@ -596,6 +596,11 @@ method statement_control:sym ($/) { make PAST::Stmts.new($past); } +method statement_or_block ($/) { + $ + ?? make $.ast + !! make $.ast +} method circumfix:sym<( )> ($/) { my $past := $.ast; diff --git a/compilers/opsc/src/Ops/Compiler/Grammar.pm b/compilers/opsc/src/Ops/Compiler/Grammar.pm index d7c316f5b9..6fcb098553 100644 --- a/compilers/opsc/src/Ops/Compiler/Grammar.pm +++ b/compilers/opsc/src/Ops/Compiler/Grammar.pm @@ -193,18 +193,18 @@ proto rule statement_control { <...> } rule statement_control:sym { '(' ')' - - [ 'else' ]? + + [ 'else' ]? } rule statement_control:sym { '(' ')' - + } rule statement_control:sym { '(' ? ';' ? ';' ? ')' - + } rule statement_control:sym { @@ -221,6 +221,11 @@ rule statement_control:sym { rule statement_control:sym { } rule statement_control:sym { } +token statement_or_block { + | <.eat_terminator> + | +} + # HACK to support for INT_FMT "\n" token term:sym { # Long-long name as LTM workaround \s+ diff --git a/t/compilers/opsc/03-past-declarator.t b/t/compilers/opsc/03-past-declarator.t index 582f1de7fc..8bc491f003 100644 --- a/t/compilers/opsc/03-past-declarator.t +++ b/t/compilers/opsc/03-past-declarator.t @@ -78,6 +78,14 @@ $past := $compiler.compile($buf, target => 'past'); $op := $past[0]; is( $op[0][0], 'for', "for loop generates right pasttype"); +$buf := q| +inline op bar(out PMC, in INT) { + if (foo) bar(); baz(); +}|; +$past := $compiler.compile($buf, target => 'past'); +$op := $past[0]; +# if, baz, WB, goto +is( +@($op[0]), 4, "Properly handle single statement in 'if'"); done_testing();