diff --git a/op.c b/op.c index 9830c1a7e824..3b28ea15751d 100644 --- a/op.c +++ b/op.c @@ -2621,8 +2621,13 @@ S_scalarseq(pTHX_ OP *o) if (type == OP_LINESEQ || type == OP_SCOPE || type == OP_LEAVE || type == OP_LEAVETRY) { - OP *kid, *sib; - for (kid = cLISTOPo->op_first; kid; kid = sib) { + OP *kid = cLISTOPo->op_first, *sib; + if(type == OP_LEAVE) { + /* Don't put the OP_ENTER in void context */ + assert(kid->op_type == OP_ENTER); + kid = OpSIBLING(kid); + } + for (; kid; kid = sib) { if ((sib = OpSIBLING(kid)) && ( OpHAS_SIBLING(sib) || sib->op_type != OP_NULL || ( sib->op_targ != OP_NEXTSTATE diff --git a/t/op/try.t b/t/op/try.t index 32095662f1e4..9b0fe2b0b5cd 100644 --- a/t/op/try.t +++ b/t/op/try.t @@ -247,6 +247,14 @@ no warnings 'experimental::try'; catch ($e) { 4, 5, 6 } }; ok(eq_array(\@list, [4, 5, 6]), 'do { try/catch } in list context'); + + # Regression test + # https://github.com/Perl/perl5/issues/18855 + $scalar = do { + try { die "Oops" } + catch ($e) { my $x = 123; "result" } + }; + is($scalar, "result", 'do { try/catch } with multiple statements'); } # try{} blocks should be invisible to caller()