191f110e0Safresh1#!./perl 291f110e0Safresh1 391f110e0Safresh1BEGIN { 4b8851fccSafresh1 chdir 't' if -d 't'; 56fb12b70Safresh1 require "./test.pl"; 69f11ffb7Safresh1 set_up_inc('../lib'); 791f110e0Safresh1} 891f110e0Safresh1 96fb12b70Safresh1plan(26); 1091f110e0Safresh1 1191f110e0Safresh1my $tmpfile = tempfile(); 1291f110e0Safresh1open (tmp,'>', $tmpfile) || die "Can't create Cmd_while.tmp."; 1391f110e0Safresh1print tmp "tvi925\n"; 1491f110e0Safresh1print tmp "tvi920\n"; 1591f110e0Safresh1print tmp "vt100\n"; 1691f110e0Safresh1print tmp "Amiga\n"; 1791f110e0Safresh1print tmp "paper\n"; 1891f110e0Safresh1close tmp or die "Could not close: $!"; 1991f110e0Safresh1 2091f110e0Safresh1# test "last" command 2191f110e0Safresh1 2291f110e0Safresh1open(fh, $tmpfile) || die "Can't open Cmd_while.tmp."; 2391f110e0Safresh1while (<fh>) { 2491f110e0Safresh1 last if /vt100/; 2591f110e0Safresh1} 2691f110e0Safresh1ok(!eof && /vt100/); 2791f110e0Safresh1 2891f110e0Safresh1# test "next" command 2991f110e0Safresh1 3091f110e0Safresh1$bad = ''; 3191f110e0Safresh1open(fh, $tmpfile) || die "Can't open Cmd_while.tmp."; 3291f110e0Safresh1while (<fh>) { 3391f110e0Safresh1 next if /vt100/; 3491f110e0Safresh1 $bad = 1 if /vt100/; 3591f110e0Safresh1} 3691f110e0Safresh1ok(eof && !/vt100/ && !$bad); 3791f110e0Safresh1 3891f110e0Safresh1# test "redo" command 3991f110e0Safresh1 4091f110e0Safresh1$bad = ''; 4191f110e0Safresh1open(fh,$tmpfile) || die "Can't open Cmd_while.tmp."; 4291f110e0Safresh1while (<fh>) { 4391f110e0Safresh1 if (s/vt100/VT100/g) { 4491f110e0Safresh1 s/VT100/Vt100/g; 4591f110e0Safresh1 redo; 4691f110e0Safresh1 } 4791f110e0Safresh1 $bad = 1 if /vt100/; 4891f110e0Safresh1 $bad = 1 if /VT100/; 4991f110e0Safresh1} 5091f110e0Safresh1ok(eof && !$bad); 5191f110e0Safresh1 5291f110e0Safresh1# now do the same with a label and a continue block 5391f110e0Safresh1 5491f110e0Safresh1# test "last" command 5591f110e0Safresh1 5691f110e0Safresh1$badcont = ''; 5791f110e0Safresh1open(fh,$tmpfile) || die "Can't open Cmd_while.tmp."; 5891f110e0Safresh1line: while (<fh>) { 5991f110e0Safresh1 if (/vt100/) {last line;} 6091f110e0Safresh1} continue { 6191f110e0Safresh1 $badcont = 1 if /vt100/; 6291f110e0Safresh1} 6391f110e0Safresh1ok(!eof && /vt100/); 6491f110e0Safresh1ok(!$badcont); 6591f110e0Safresh1 6691f110e0Safresh1# test "next" command 6791f110e0Safresh1 6891f110e0Safresh1$bad = ''; 6991f110e0Safresh1$badcont = 1; 7091f110e0Safresh1open(fh,$tmpfile) || die "Can't open Cmd_while.tmp."; 7191f110e0Safresh1entry: while (<fh>) { 7291f110e0Safresh1 next entry if /vt100/; 7391f110e0Safresh1 $bad = 1 if /vt100/; 7491f110e0Safresh1} continue { 7591f110e0Safresh1 $badcont = '' if /vt100/; 7691f110e0Safresh1} 7791f110e0Safresh1ok(eof && !/vt100/ && !$bad); 7891f110e0Safresh1ok(!$badcont); 7991f110e0Safresh1 8091f110e0Safresh1# test "redo" command 8191f110e0Safresh1 8291f110e0Safresh1$bad = ''; 8391f110e0Safresh1$badcont = ''; 8491f110e0Safresh1open(fh,$tmpfile) || die "Can't open Cmd_while.tmp."; 8591f110e0Safresh1loop: while (<fh>) { 8691f110e0Safresh1 if (s/vt100/VT100/g) { 8791f110e0Safresh1 s/VT100/Vt100/g; 8891f110e0Safresh1 redo loop; 8991f110e0Safresh1 } 9091f110e0Safresh1 $bad = 1 if /vt100/; 9191f110e0Safresh1 $bad = 1 if /VT100/; 9291f110e0Safresh1} continue { 9391f110e0Safresh1 $badcont = 1 if /vt100/; 9491f110e0Safresh1} 9591f110e0Safresh1ok(eof && !$bad); 9691f110e0Safresh1ok(!$badcont); 9791f110e0Safresh1 9891f110e0Safresh1close(fh) || die "Can't close Cmd_while.tmp."; 9991f110e0Safresh1 10091f110e0Safresh1$i = 9; 10191f110e0Safresh1{ 10291f110e0Safresh1 $i++; 10391f110e0Safresh1} 10491f110e0Safresh1is($i, 10); 10591f110e0Safresh1 10691f110e0Safresh1# Check curpm is reset when jumping out of a scope 10791f110e0Safresh1$i = 0; 10891f110e0Safresh1'abc' =~ /b/; 10991f110e0Safresh1WHILE: 11091f110e0Safresh1while (1) { 11191f110e0Safresh1 $i++; 11291f110e0Safresh1 is($` . $& . $', "abc"); 11391f110e0Safresh1 { # Localize changes to $` and friends 11491f110e0Safresh1 'end' =~ /end/; 11591f110e0Safresh1 redo WHILE if $i == 1; 11691f110e0Safresh1 next WHILE if $i == 2; 11791f110e0Safresh1 # 3 do a normal loop 11891f110e0Safresh1 last WHILE if $i == 4; 11991f110e0Safresh1 } 12091f110e0Safresh1} 12191f110e0Safresh1is($` . $& . $', "abc"); 12291f110e0Safresh1 12391f110e0Safresh1# check that scope cleanup happens right when there's a continue block 12491f110e0Safresh1{ 12591f110e0Safresh1 my $var = 16; 126*eac174f2Safresh1 my ($got_var, $got_i); 12791f110e0Safresh1 while (my $i = ++$var) { 12891f110e0Safresh1 next if $i == 17; 12991f110e0Safresh1 last if $i > 17; 13091f110e0Safresh1 my $i = 0; 13191f110e0Safresh1 } 13291f110e0Safresh1 continue { 13391f110e0Safresh1 ($got_var, $got_i) = ($var, $i); 13491f110e0Safresh1 } 13591f110e0Safresh1 is($got_var, 17); 13691f110e0Safresh1 is($got_i, 17); 13791f110e0Safresh1} 13891f110e0Safresh1 13991f110e0Safresh1{ 14091f110e0Safresh1 my $got_l; 14191f110e0Safresh1 local $l = 18; 14291f110e0Safresh1 { 14391f110e0Safresh1 local $l = 0 14491f110e0Safresh1 } 14591f110e0Safresh1 continue { 14691f110e0Safresh1 $got_l = $l; 14791f110e0Safresh1 } 14891f110e0Safresh1 is($got_l, 18); 14991f110e0Safresh1} 15091f110e0Safresh1 15191f110e0Safresh1{ 15291f110e0Safresh1 my $got_l; 15391f110e0Safresh1 local $l = 19; 15491f110e0Safresh1 my $x = 0; 15591f110e0Safresh1 while (!$x++) { 15691f110e0Safresh1 local $l = 0 15791f110e0Safresh1 } 15891f110e0Safresh1 continue { 15991f110e0Safresh1 $got_l = $l; 16091f110e0Safresh1 } 16191f110e0Safresh1 is($got_l, $l); 16291f110e0Safresh1} 16391f110e0Safresh1 16491f110e0Safresh1{ 16591f110e0Safresh1 my $ok = 1; 16691f110e0Safresh1 $i = 20; 16791f110e0Safresh1 while (1) { 16891f110e0Safresh1 my $x; 16991f110e0Safresh1 $ok = 0 if defined $x; 17091f110e0Safresh1 if ($i == 21) { 17191f110e0Safresh1 next; 17291f110e0Safresh1 } 17391f110e0Safresh1 last; 17491f110e0Safresh1 } 17591f110e0Safresh1 continue { 17691f110e0Safresh1 ++$i; 17791f110e0Safresh1 } 17891f110e0Safresh1 ok($ok); 17991f110e0Safresh1} 18091f110e0Safresh1 18191f110e0Safresh1sub save_context { $_[0] = wantarray; $_[1] } 18291f110e0Safresh1 18391f110e0Safresh1{ 18491f110e0Safresh1 my $context = -1; 18591f110e0Safresh1 my $p = sub { 18691f110e0Safresh1 my $x = 1; 18791f110e0Safresh1 while ($x--) { 18891f110e0Safresh1 save_context($context, "foo"); 18991f110e0Safresh1 } 19091f110e0Safresh1 }; 19191f110e0Safresh1 is(scalar($p->()), 0); 19291f110e0Safresh1 is($context, undef, "last statement in while block has 'void' context"); 19391f110e0Safresh1} 19491f110e0Safresh1 19591f110e0Safresh1{ 19691f110e0Safresh1 my $context = -1; 19791f110e0Safresh1 my $p = sub { 19891f110e0Safresh1 my $x = 1; 19991f110e0Safresh1 { 20091f110e0Safresh1 save_context($context, "foo"); 20191f110e0Safresh1 } 20291f110e0Safresh1 }; 20391f110e0Safresh1 is(scalar($p->()), "foo"); 20491f110e0Safresh1 is($context, "", "last statement in block has 'scalar' context"); 20591f110e0Safresh1} 20691f110e0Safresh1 20791f110e0Safresh1{ 20891f110e0Safresh1 # test scope is cleaned 20991f110e0Safresh1 my $i = 0; 21091f110e0Safresh1 my @a; 21191f110e0Safresh1 while ($i++ < 2) { 21291f110e0Safresh1 my $x; 21391f110e0Safresh1 push @a, \$x; 21491f110e0Safresh1 } 21591f110e0Safresh1 ok($a[0] ne $a[1]); 21691f110e0Safresh1} 2176fb12b70Safresh1 2186fb12b70Safresh1fresh_perl_is <<'72406', "foobar\n", {}, 2196fb12b70Safresh1{ package o; use overload bool => sub { die unless $::ok++; return 1 } } 2206fb12b70Safresh1use constant OK => bless [], o::; 2216fb12b70Safresh1do{print("foobar\n");}until OK; 2226fb12b70Safresh172406 2236fb12b70Safresh1 "[perl #72406] segv with do{}until CONST where const is not folded"; 224