use warnings;
use strict;
-plan tests => 53;
+plan tests => 57;
our $foo;
while ($?) {
sub f1 {
my $x;
- goto sub { $x=0; print "ok 28 - don't prematurely free CV\n" }
+ goto sub { $x=0; ok(1,"don't prematurely free CV\n") }
}
f1();
my $r = runperl(
stderr => 1,
prog =>
-'for ($_=0;$_<3;$_++){A: if($_==1){next} if($_==2){$_++;goto A}}print qq(ok)'
+'for ($_=0;$_<3;$_++){A: if($_==1){next} if($_==2){$_++;goto A}}print qq(ok\n)'
);
- is($r, "ok", 'next and goto');
+ is($r, "ok\n", 'next and goto');
$r = runperl(
stderr => 1,
prog =>
-'for ($_=0;$_<3;$_++){A: if($_==1){$_++;redo} if($_==2){$_++;goto A}}print qq(ok)'
+'for ($_=0;$_<3;$_++){A: if($_==1){$_++;redo} if($_==2){$_++;goto A}}print qq(ok\n)'
);
- is($r, "ok", 'redo and goto');
+ is($r, "ok\n", 'redo and goto');
}
+# goto &foo not allowed in evals
+
+sub null { 1 };
+eval 'goto &null';
+like($@, qr/Can't goto subroutine from an eval-string/, 'eval string');
+eval { goto &null };
+like($@, qr/Can't goto subroutine from an eval-block/, 'eval block');
+
+# [perl #36521] goto &foo in warn handler could defeat recursion avoider
+
+{
+ my $r = runperl(
+ stderr => 1,
+ prog => 'my $d; my $w = sub { return if $d++; warn q(bar)}; local $SIG{__WARN__} = sub { goto &$w; }; warn q(foo);'
+ );
+ like($r, qr/bar/, "goto &foo in warn");
+}