xref: /openbsd-src/gnu/usr.bin/perl/t/op/while.t (revision eac174f2741a08d8deb8aae59a7f778ef9b5d770)
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