1N/A#!./perl
1N/A
1N/A# We have the following types of loop:
1N/A#
1N/A# 1a) while(A) {B}
1N/A# 1b) B while A;
1N/A#
1N/A# 2a) until(A) {B}
1N/A# 2b) B until A;
1N/A#
1N/A# 3a) for(@A) {B}
1N/A# 3b) B for A;
1N/A#
1N/A# 4a) for (A;B;C) {D}
1N/A#
1N/A# 5a) { A } # a bare block is a loop which runs once
1N/A#
1N/A# Loops of type (b) don't allow for next/last/redo style
1N/A# control, so we ignore them here. Type (a) loops can
1N/A# all be labelled, so there are ten possibilities (each
1N/A# of 5 types, labelled/unlabelled). We therefore need
1N/A# thirty tests to try the three control statements against
1N/A# the ten types of loop. For the first four types it's useful
1N/A# to distinguish the case where next re-iterates from the case
1N/A# where it leaves the loop. That makes 38.
1N/A# All these tests rely on "last LABEL"
1N/A# so if they've *all* failed, maybe you broke that...
1N/A#
1N/A# These tests are followed by an extra test of nested loops.
1N/A# Feel free to add more here.
1N/A#
1N/A# -- .robin. <robin@kitsite.com> 2001-03-13
1N/A
1N/Aprint "1..43\n";
1N/A
1N/Amy $ok;
1N/A
1N/A## while() loop without a label
1N/A
1N/ATEST1: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 1;
1N/A my $first_time = 1;
1N/A while($x--) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST1;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A redo;
1N/A last TEST1;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST1;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 1\n" : "not ok 1\n");
1N/A
1N/ATEST2: { # next (succesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 2;
1N/A my $first_time = 1;
1N/A my $been_in_continue = 0;
1N/A while($x--) {
1N/A if (!$first_time) {
1N/A $ok = $been_in_continue;
1N/A last TEST2;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next;
1N/A last TEST2;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 2\n" : "not ok 2\n");
1N/A
1N/ATEST3: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 1;
1N/A my $first_time = 1;
1N/A my $been_in_loop = 0;
1N/A my $been_in_continue = 0;
1N/A while($x--) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST3;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next;
1N/A last TEST3;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = $been_in_loop && $been_in_continue;
1N/A}
1N/Aprint ($ok ? "ok 3\n" : "not ok 3\n");
1N/A
1N/ATEST4: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 1;
1N/A my $first_time = 1;
1N/A while($x++) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST4;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last;
1N/A last TEST4;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST4;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 4\n" : "not ok 4\n");
1N/A
1N/A
1N/A## until() loop without a label
1N/A
1N/ATEST5: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A until($x++) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST5;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A redo;
1N/A last TEST5;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST5;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 5\n" : "not ok 5\n");
1N/A
1N/ATEST6: { # next (succesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A my $been_in_continue = 0;
1N/A until($x++ >= 2) {
1N/A if (!$first_time) {
1N/A $ok = $been_in_continue;
1N/A last TEST6;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next;
1N/A last TEST6;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 6\n" : "not ok 6\n");
1N/A
1N/ATEST7: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A my $been_in_loop = 0;
1N/A my $been_in_continue = 0;
1N/A until($x++) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST7;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next;
1N/A last TEST7;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = $been_in_loop && $been_in_continue;
1N/A}
1N/Aprint ($ok ? "ok 7\n" : "not ok 7\n");
1N/A
1N/ATEST8: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A until($x++ == 10) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST8;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last;
1N/A last TEST8;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST8;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 8\n" : "not ok 8\n");
1N/A
1N/A## for(@array) loop without a label
1N/A
1N/ATEST9: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A for(1) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST9;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A redo;
1N/A last TEST9;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST9;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 9\n" : "not ok 9\n");
1N/A
1N/ATEST10: { # next (succesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A my $been_in_continue = 0;
1N/A for(1,2) {
1N/A if (!$first_time) {
1N/A $ok = $been_in_continue;
1N/A last TEST10;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next;
1N/A last TEST10;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 10\n" : "not ok 10\n");
1N/A
1N/ATEST11: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A my $been_in_loop = 0;
1N/A my $been_in_continue = 0;
1N/A for(1) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST11;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next;
1N/A last TEST11;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = $been_in_loop && $been_in_continue;
1N/A}
1N/Aprint ($ok ? "ok 11\n" : "not ok 11\n");
1N/A
1N/ATEST12: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A for(1..10) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST12;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last;
1N/A last TEST12;
1N/A }
1N/A continue {
1N/A $ok=0;
1N/A last TEST12;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 12\n" : "not ok 12\n");
1N/A
1N/A## for(;;) loop without a label
1N/A
1N/ATEST13: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A for(my $first_time = 1; 1;) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST13;
1N/A }
1N/A $ok = 0;
1N/A $first_time=0;
1N/A
1N/A redo;
1N/A last TEST13;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 13\n" : "not ok 13\n");
1N/A
1N/ATEST14: { # next (successful)
1N/A
1N/A $ok = 0;
1N/A
1N/A for(my $first_time = 1; 1; $first_time=0) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST14;
1N/A }
1N/A $ok = 0;
1N/A next;
1N/A last TEST14;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 14\n" : "not ok 14\n");
1N/A
1N/ATEST15: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x=1;
1N/A my $been_in_loop = 0;
1N/A for(my $first_time = 1; $x--;) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST15;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next;
1N/A last TEST15;
1N/A }
1N/A $ok = $been_in_loop;
1N/A}
1N/Aprint ($ok ? "ok 15\n" : "not ok 15\n");
1N/A
1N/ATEST16: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A for(my $first_time = 1; 1; last TEST16) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST16;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last;
1N/A last TEST16;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 16\n" : "not ok 16\n");
1N/A
1N/A## bare block without a label
1N/A
1N/ATEST17: { # redo
1N/A
1N/A $ok = 0;
1N/A my $first_time = 1;
1N/A
1N/A {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST17;
1N/A }
1N/A $ok = 0;
1N/A $first_time=0;
1N/A
1N/A redo;
1N/A last TEST17;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST17;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 17\n" : "not ok 17\n");
1N/A
1N/ATEST18: { # next
1N/A
1N/A $ok = 0;
1N/A {
1N/A next;
1N/A last TEST18;
1N/A }
1N/A continue {
1N/A $ok = 1;
1N/A last TEST18;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 18\n" : "not ok 18\n");
1N/A
1N/ATEST19: { # last
1N/A
1N/A $ok = 0;
1N/A {
1N/A last;
1N/A last TEST19;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST19;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 19\n" : "not ok 19\n");
1N/A
1N/A
1N/A### Now do it all again with labels
1N/A
1N/A## while() loop with a label
1N/A
1N/ATEST20: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 1;
1N/A my $first_time = 1;
1N/A LABEL20: while($x--) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST20;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A redo LABEL20;
1N/A last TEST20;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST20;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 20\n" : "not ok 20\n");
1N/A
1N/ATEST21: { # next (succesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 2;
1N/A my $first_time = 1;
1N/A my $been_in_continue = 0;
1N/A LABEL21: while($x--) {
1N/A if (!$first_time) {
1N/A $ok = $been_in_continue;
1N/A last TEST21;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next LABEL21;
1N/A last TEST21;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 21\n" : "not ok 21\n");
1N/A
1N/ATEST22: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 1;
1N/A my $first_time = 1;
1N/A my $been_in_loop = 0;
1N/A my $been_in_continue = 0;
1N/A LABEL22: while($x--) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST22;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next LABEL22;
1N/A last TEST22;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = $been_in_loop && $been_in_continue;
1N/A}
1N/Aprint ($ok ? "ok 22\n" : "not ok 22\n");
1N/A
1N/ATEST23: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 1;
1N/A my $first_time = 1;
1N/A LABEL23: while($x++) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST23;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last LABEL23;
1N/A last TEST23;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST23;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 23\n" : "not ok 23\n");
1N/A
1N/A
1N/A## until() loop with a label
1N/A
1N/ATEST24: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A LABEL24: until($x++) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST24;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A redo LABEL24;
1N/A last TEST24;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST24;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 24\n" : "not ok 24\n");
1N/A
1N/ATEST25: { # next (succesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A my $been_in_continue = 0;
1N/A LABEL25: until($x++ >= 2) {
1N/A if (!$first_time) {
1N/A $ok = $been_in_continue;
1N/A last TEST25;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next LABEL25;
1N/A last TEST25;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 25\n" : "not ok 25\n");
1N/A
1N/ATEST26: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A my $been_in_loop = 0;
1N/A my $been_in_continue = 0;
1N/A LABEL26: until($x++) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST26;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next LABEL26;
1N/A last TEST26;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = $been_in_loop && $been_in_continue;
1N/A}
1N/Aprint ($ok ? "ok 26\n" : "not ok 26\n");
1N/A
1N/ATEST27: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x = 0;
1N/A my $first_time = 1;
1N/A LABEL27: until($x++ == 10) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST27;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last LABEL27;
1N/A last TEST27;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST8;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 27\n" : "not ok 27\n");
1N/A
1N/A## for(@array) loop with a label
1N/A
1N/ATEST28: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A LABEL28: for(1) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST28;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A redo LABEL28;
1N/A last TEST28;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST28;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 28\n" : "not ok 28\n");
1N/A
1N/ATEST29: { # next (succesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A my $been_in_continue = 0;
1N/A LABEL29: for(1,2) {
1N/A if (!$first_time) {
1N/A $ok = $been_in_continue;
1N/A last TEST29;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next LABEL29;
1N/A last TEST29;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 29\n" : "not ok 29\n");
1N/A
1N/ATEST30: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A my $been_in_loop = 0;
1N/A my $been_in_continue = 0;
1N/A LABEL30: for(1) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST30;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next LABEL30;
1N/A last TEST30;
1N/A }
1N/A continue {
1N/A $been_in_continue = 1;
1N/A }
1N/A $ok = $been_in_loop && $been_in_continue;
1N/A}
1N/Aprint ($ok ? "ok 30\n" : "not ok 30\n");
1N/A
1N/ATEST31: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A my $first_time = 1;
1N/A LABEL31: for(1..10) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST31;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last LABEL31;
1N/A last TEST31;
1N/A }
1N/A continue {
1N/A $ok=0;
1N/A last TEST31;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 31\n" : "not ok 31\n");
1N/A
1N/A## for(;;) loop with a label
1N/A
1N/ATEST32: { # redo
1N/A
1N/A $ok = 0;
1N/A
1N/A LABEL32: for(my $first_time = 1; 1;) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST32;
1N/A }
1N/A $ok = 0;
1N/A $first_time=0;
1N/A
1N/A redo LABEL32;
1N/A last TEST32;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 32\n" : "not ok 32\n");
1N/A
1N/ATEST33: { # next (successful)
1N/A
1N/A $ok = 0;
1N/A
1N/A LABEL33: for(my $first_time = 1; 1; $first_time=0) {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST33;
1N/A }
1N/A $ok = 0;
1N/A next LABEL33;
1N/A last TEST33;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 33\n" : "not ok 33\n");
1N/A
1N/ATEST34: { # next (unsuccesful)
1N/A
1N/A $ok = 0;
1N/A
1N/A my $x=1;
1N/A my $been_in_loop = 0;
1N/A LABEL34: for(my $first_time = 1; $x--;) {
1N/A $been_in_loop = 1;
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST34;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A next LABEL34;
1N/A last TEST34;
1N/A }
1N/A $ok = $been_in_loop;
1N/A}
1N/Aprint ($ok ? "ok 34\n" : "not ok 34\n");
1N/A
1N/ATEST35: { # last
1N/A
1N/A $ok = 0;
1N/A
1N/A LABEL35: for(my $first_time = 1; 1; last TEST16) {
1N/A if (!$first_time) {
1N/A $ok = 0;
1N/A last TEST35;
1N/A }
1N/A $ok = 0;
1N/A $first_time = 0;
1N/A last LABEL35;
1N/A last TEST35;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 35\n" : "not ok 35\n");
1N/A
1N/A## bare block with a label
1N/A
1N/ATEST36: { # redo
1N/A
1N/A $ok = 0;
1N/A my $first_time = 1;
1N/A
1N/A LABEL36: {
1N/A if (!$first_time) {
1N/A $ok = 1;
1N/A last TEST36;
1N/A }
1N/A $ok = 0;
1N/A $first_time=0;
1N/A
1N/A redo LABEL36;
1N/A last TEST36;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST36;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 36\n" : "not ok 36\n");
1N/A
1N/ATEST37: { # next
1N/A
1N/A $ok = 0;
1N/A LABEL37: {
1N/A next LABEL37;
1N/A last TEST37;
1N/A }
1N/A continue {
1N/A $ok = 1;
1N/A last TEST37;
1N/A }
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 37\n" : "not ok 37\n");
1N/A
1N/ATEST38: { # last
1N/A
1N/A $ok = 0;
1N/A LABEL38: {
1N/A last LABEL38;
1N/A last TEST38;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST38;
1N/A }
1N/A $ok = 1;
1N/A}
1N/Aprint ($ok ? "ok 38\n" : "not ok 38\n");
1N/A
1N/A### Now test nested constructs
1N/A
1N/ATEST39: {
1N/A $ok = 0;
1N/A my ($x, $y, $z) = (1,1,1);
1N/A one39: while ($x--) {
1N/A $ok = 0;
1N/A two39: while ($y--) {
1N/A $ok = 0;
1N/A three39: while ($z--) {
1N/A next two39;
1N/A }
1N/A continue {
1N/A $ok = 0;
1N/A last TEST39;
1N/A }
1N/A }
1N/A continue {
1N/A $ok = 1;
1N/A last TEST39;
1N/A }
1N/A $ok = 0;
1N/A }
1N/A}
1N/Aprint ($ok ? "ok 39\n" : "not ok 39\n");
1N/A
1N/A
1N/A### Test that loop control is dynamicly scoped.
1N/A
1N/Asub test_last_label { last TEST40 }
1N/A
1N/ATEST40: {
1N/A $ok = 1;
1N/A test_last_label();
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 40\n" : "not ok 40\n");
1N/A
1N/Asub test_last { last }
1N/A
1N/ATEST41: {
1N/A $ok = 1;
1N/A test_last();
1N/A $ok = 0;
1N/A}
1N/Aprint ($ok ? "ok 41\n" : "not ok 41\n");
1N/A
1N/A
1N/A# [perl #27206] Memory leak in continue loop
1N/A# Ensure that the temporary object is freed each time round the loop,
1N/A# rather then all 10 of them all being freed right at the end
1N/A
1N/A{
1N/A my $n=10; my $late_free = 0;
1N/A sub X::DESTROY { $late_free++ if $n < 0 };
1N/A {
1N/A ($n-- && bless {}, 'X') && redo;
1N/A }
1N/A print $late_free ? "not " : "", "ok 42 - redo memory leak\n";
1N/A
1N/A $n = 10; $late_free = 0;
1N/A {
1N/A ($n-- && bless {}, 'X') && redo;
1N/A }
1N/A continue { }
1N/A print $late_free ? "not " : "", "ok 43 - redo with continue memory leak\n";
1N/A}
1N/A
1N/A