next and redo didn't restore PL_curcop
p4raw-id: //depot/perl@24384
SV **mark;
POPBLOCK(cx,newpm);
+ assert(CxTYPE(cx) == CXt_LOOP);
mark = newsp;
newsp = PL_stack_base + cx->blk_loop.resetsp;
TOPBLOCK(cx);
if (PL_scopestack_ix < inner)
leave_scope(PL_scopestack[PL_scopestack_ix]);
+ PL_curcop = cx->blk_oldcop;
return cx->blk_loop.next_op;
}
oldsave = PL_scopestack[PL_scopestack_ix - 1];
LEAVE_SCOPE(oldsave);
FREETMPS;
+ PL_curcop = cx->blk_oldcop;
return cx->blk_loop.redo_op;
}
@INC = qw(. ../lib);
}
-print "1..47\n";
+print "1..49\n";
require "test.pl";
sub c32039 { print $_[0] eq 'foo' ? "" : "not ", "ok 47 - chained &goto\n" }
a32039();
+# [perl #35214] next and redo re-entered the loop with the wrong cop,
+# causing a subsequent goto to crash
+
+{
+ my $r = runperl(
+ stderr => 1,
+ prog =>
+'for ($_=0;$_<3;$_++){A: if($_==1){next} if($_==2){$_++;goto A}}print qq(ok)'
+ );
+ $r =~ s/\n//g;
+ print "# r=$r\nnot " unless $r eq 'ok';
+ print "ok 48 - next and goto\n";
+
+ $r = runperl(
+ stderr => 1,
+ prog =>
+'for ($_=0;$_<3;$_++){A: if($_==1){$_++;redo} if($_==2){$_++;goto A}}print qq(ok)'
+ );
+ $r =~ s/\n//g;
+ print "# r=$r\nnot " unless $r eq 'ok';
+ print "ok 49 - redo and goto\n";
+}