diff options
-rw-r--r-- | op.c | 4 | ||||
-rw-r--r-- | t/comp/parser.t | 10 |
2 files changed, 13 insertions, 1 deletions
@@ -3577,6 +3577,10 @@ Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block) } } + /* if block is null, the next append_elem() would put UNSTACK, a scalar + * op, in listop. This is wrong. [perl #27024] */ + if (!block) + block = newOP(OP_NULL, 0); listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0)); o = new_logop(OP_AND, 0, &expr, &listop); diff --git a/t/comp/parser.t b/t/comp/parser.t index e59fec6622..2c25807021 100644 --- a/t/comp/parser.t +++ b/t/comp/parser.t @@ -9,7 +9,7 @@ BEGIN { } require "./test.pl"; -plan( tests => 43 ); +plan( tests => 44 ); eval '%@x=0;'; like( $@, qr/^Can't modify hash dereference in repeat \(x\)/, '%@x=0' ); @@ -147,3 +147,11 @@ EOF eval q{ sub f { @a=@b=@c; {use} } }; like( $@, qr/syntax error/, "use without body" ); } + +# Bug #27024 +{ + # this used to segfault (because $[=1 is optimized away to a null block) + my $x; + $[ = 1 while $x; + pass(); +} |