3 # We have the following types of loop:
16 # 5a) { A } # a bare block is a loop which runs once
18 # Loops of type (b) don't allow for next/last/redo style
19 # control, so we ignore them here. Type (a) loops can
20 # all be labelled, so there are ten possibilities (each
21 # of 5 types, labelled/unlabelled). We therefore need
22 # thirty tests to try the three control statements against
23 # the ten types of loop. For the first four types it's useful
24 # to distinguish the case where next re-iterates from the case
25 # where it leaves the loop. That makes 38.
26 # All these tests rely on "last LABEL"
27 # so if they've *all* failed, maybe you broke that...
29 # These tests are followed by an extra test of nested loops.
30 # Feel free to add more here.
32 # -- .robin. <robin@kitsite.com> 2001-03-13
65 cmp_ok($ok,'==',1,'no label on while()');
73 my $been_in_continue = 0;
76 $ok = $been_in_continue;
85 $been_in_continue = 1;
89 cmp_ok($ok,'==',1,'no label on while() successful next');
98 my $been_in_continue = 0;
111 $been_in_continue = 1;
113 $ok = $been_in_loop && $been_in_continue;
115 cmp_ok($ok,'==',1,'no label on while() unsuccessful next');
139 cmp_ok($ok,'==',1,'no label on while() last');
163 cmp_ok($ok,'==',1,'no label on until()');
171 my $been_in_continue = 0;
174 $ok = $been_in_continue;
183 $been_in_continue = 1;
187 cmp_ok($ok,'==',1,'no label on until() successful next');
195 my $been_in_loop = 0;
196 my $been_in_continue = 0;
209 $been_in_continue = 1;
211 $ok = $been_in_loop && $been_in_continue;
213 cmp_ok($ok,'==',1,'no label on until() unsuccessful next');
237 cmp_ok($ok,'==',1,'no label on until() last');
260 cmp_ok($ok,'==',1,'no label on for(@array)');
267 my $been_in_continue = 0;
270 $ok = $been_in_continue;
279 $been_in_continue = 1;
283 cmp_ok($ok,'==',1,'no label on for(@array) successful next');
290 my $been_in_loop = 0;
291 my $been_in_continue = 0;
304 $been_in_continue = 1;
306 $ok = $been_in_loop && $been_in_continue;
308 cmp_ok($ok,'==',1,'no label on for(@array) unsuccessful next');
331 cmp_ok($ok,'==',1,'no label on for(@array) last');
337 for(my $first_time = 1; 1;) {
350 cmp_ok($ok,'==',1,'no label on for(;;)');
356 for(my $first_time = 1; 1; $first_time=0) {
367 cmp_ok($ok,'==',1,'no label on for(;;) successful next');
374 my $been_in_loop = 0;
375 for(my $first_time = 1; $x--;) {
388 cmp_ok($ok,'==',1,'no label on for(;;) unsuccessful next');
394 for(my $first_time = 1; 1; last TEST16) {
406 cmp_ok($ok,'==',1,'no label on for(;;) last');
430 cmp_ok($ok,'==',1,'no label on bare block');
445 cmp_ok($ok,'==',1,'no label on bare block next');
460 cmp_ok($ok,'==',1,'no label on bare block last');
462 ### Now do it all again with labels
470 LABEL20: while($x--) {
486 cmp_ok($ok,'==',1,'label on while()');
494 my $been_in_continue = 0;
495 LABEL21: while($x--) {
497 $ok = $been_in_continue;
506 $been_in_continue = 1;
510 cmp_ok($ok,'==',1,'label on while() successful next');
518 my $been_in_loop = 0;
519 my $been_in_continue = 0;
520 LABEL22: while($x--) {
532 $been_in_continue = 1;
534 $ok = $been_in_loop && $been_in_continue;
536 cmp_ok($ok,'==',1,'label on while() unsuccessful next');
544 LABEL23: while($x++) {
560 cmp_ok($ok,'==',1,'label on while() last');
568 LABEL24: until($x++) {
584 cmp_ok($ok,'==',1,'label on until()');
592 my $been_in_continue = 0;
593 LABEL25: until($x++ >= 2) {
595 $ok = $been_in_continue;
604 $been_in_continue = 1;
608 cmp_ok($ok,'==',1,'label on until() successful next');
616 my $been_in_loop = 0;
617 my $been_in_continue = 0;
618 LABEL26: until($x++) {
630 $been_in_continue = 1;
632 $ok = $been_in_loop && $been_in_continue;
634 cmp_ok($ok,'==',1,'label on until() unsuccessful next');
642 LABEL27: until($x++ == 10) {
658 cmp_ok($ok,'==',1,'label on until() last');
681 cmp_ok($ok,'==',1,'label on for(@array)');
688 my $been_in_continue = 0;
691 $ok = $been_in_continue;
700 $been_in_continue = 1;
704 cmp_ok($ok,'==',1,'label on for(@array) successful next');
711 my $been_in_loop = 0;
712 my $been_in_continue = 0;
725 $been_in_continue = 1;
727 $ok = $been_in_loop && $been_in_continue;
729 cmp_ok($ok,'==',1,'label on for(@array) unsuccessful next');
736 LABEL31: for(1..10) {
752 cmp_ok($ok,'==',1,'label on for(@array) last');
758 LABEL32: for(my $first_time = 1; 1;) {
771 cmp_ok($ok,'==',1,'label on for(;;)');
777 LABEL33: for(my $first_time = 1; 1; $first_time=0) {
788 cmp_ok($ok,'==',1,'label on for(;;) successful next');
795 my $been_in_loop = 0;
796 LABEL34: for(my $first_time = 1; $x--;) {
809 cmp_ok($ok,'==',1,'label on for(;;) unsuccessful next');
815 LABEL35: for(my $first_time = 1; 1; last TEST16) {
827 cmp_ok($ok,'==',1,'label on for(;;) last');
851 cmp_ok($ok,'==',1,'label on bare block');
866 cmp_ok($ok,'==',1,'label on bare block next');
881 cmp_ok($ok,'==',1,'label on bare block last');
885 my ($x, $y, $z) = (1,1,1);
886 one39: while ($x--) {
888 two39: while ($y--) {
890 three39: while ($z--) {
905 cmp_ok($ok,'==',1,'nested constructs');
907 sub test_last_label { last TEST40 }
914 cmp_ok($ok,'==',1,'dynamically scoped label');
916 sub test_last { last }
923 cmp_ok($ok,'==',1,'dynamically scoped');
926 # [perl #27206] Memory leak in continue loop
927 # Ensure that the temporary object is freed each time round the loop,
928 # rather then all 10 of them all being freed right at the end
931 my $n=10; my $late_free = 0;
932 sub X::DESTROY { $late_free++ if $n < 0 };
934 ($n-- && bless {}, 'X') && redo;
936 cmp_ok($late_free,'==',0,"bug 27206: redo memory leak");
938 $n = 10; $late_free = 0;
940 ($n-- && bless {}, 'X') && redo;
943 cmp_ok($late_free,'==',0,"bug 27206: redo with continue memory leak");
946 # ensure that redo doesn't clear a lexical declared in the condition
953 cmp_ok($x,'==',1,"while/redo lexical life");
957 until (! (my $x = $i)) {
960 cmp_ok($x,'==',1,"until/redo lexical life");
963 for ($i = 1; my $x = $i; ) {
966 cmp_ok($x,'==',1,"for/redo lexical life");
973 $a37725[3] = 1; # use package var
975 for my $x (reverse @a37725) {
978 cmp_ok("@a37725",'eq',"5 4 3 2",'bug 27725: reverse with empty slots bug');