xref: /openbsd-src/gnu/usr.bin/perl/t/op/for.t (revision e068048151d29f2562a32185e21a8ba885482260)
191f110e0Safresh1#!./perl
291f110e0Safresh1
391f110e0Safresh1BEGIN {
4b8851fccSafresh1    chdir 't' if -d 't';
5b8851fccSafresh1    require "./test.pl";
6eac174f2Safresh1    set_up_inc('../lib');
791f110e0Safresh1}
891f110e0Safresh1
9eac174f2Safresh1use strict qw(subs refs);
10eac174f2Safresh1use warnings;
1191f110e0Safresh1
1291f110e0Safresh1# A lot of tests to check that reversed for works.
1391f110e0Safresh1
1491f110e0Safresh1@array = ('A', 'B', 'C');
1591f110e0Safresh1for (@array) {
1691f110e0Safresh1    $r .= $_;
1791f110e0Safresh1}
1891f110e0Safresh1is ($r, 'ABC', 'Forwards for array');
1991f110e0Safresh1$r = '';
2091f110e0Safresh1for (1,2,3) {
2191f110e0Safresh1    $r .= $_;
2291f110e0Safresh1}
2391f110e0Safresh1is ($r, '123', 'Forwards for list');
2491f110e0Safresh1$r = '';
2591f110e0Safresh1for (map {$_} @array) {
2691f110e0Safresh1    $r .= $_;
2791f110e0Safresh1}
2891f110e0Safresh1is ($r, 'ABC', 'Forwards for array via map');
2991f110e0Safresh1$r = '';
3091f110e0Safresh1for (map {$_} 1,2,3) {
3191f110e0Safresh1    $r .= $_;
3291f110e0Safresh1}
3391f110e0Safresh1is ($r, '123', 'Forwards for list via map');
3491f110e0Safresh1$r = '';
3591f110e0Safresh1for (1 .. 3) {
3691f110e0Safresh1    $r .= $_;
3791f110e0Safresh1}
3891f110e0Safresh1is ($r, '123', 'Forwards for list via ..');
3991f110e0Safresh1$r = '';
4091f110e0Safresh1for ('A' .. 'C') {
4191f110e0Safresh1    $r .= $_;
4291f110e0Safresh1}
4391f110e0Safresh1is ($r, 'ABC', 'Forwards for list via ..');
4491f110e0Safresh1
4591f110e0Safresh1$r = '';
4691f110e0Safresh1for (reverse @array) {
4791f110e0Safresh1    $r .= $_;
4891f110e0Safresh1}
4991f110e0Safresh1is ($r, 'CBA', 'Reverse for array');
5091f110e0Safresh1$r = '';
5191f110e0Safresh1for (reverse 1,2,3) {
5291f110e0Safresh1    $r .= $_;
5391f110e0Safresh1}
5491f110e0Safresh1is ($r, '321', 'Reverse for list');
5591f110e0Safresh1$r = '';
5691f110e0Safresh1for (reverse map {$_} @array) {
5791f110e0Safresh1    $r .= $_;
5891f110e0Safresh1}
5991f110e0Safresh1is ($r, 'CBA', 'Reverse for array via map');
6091f110e0Safresh1$r = '';
6191f110e0Safresh1for (reverse map {$_} 1,2,3) {
6291f110e0Safresh1    $r .= $_;
6391f110e0Safresh1}
6491f110e0Safresh1is ($r, '321', 'Reverse for list via map');
6591f110e0Safresh1$r = '';
6691f110e0Safresh1for (reverse 1 .. 3) {
6791f110e0Safresh1    $r .= $_;
6891f110e0Safresh1}
6991f110e0Safresh1is ($r, '321', 'Reverse for list via ..');
7091f110e0Safresh1$r = '';
7191f110e0Safresh1for (reverse 'A' .. 'C') {
7291f110e0Safresh1    $r .= $_;
7391f110e0Safresh1}
7491f110e0Safresh1is ($r, 'CBA', 'Reverse for list via ..');
7591f110e0Safresh1
7691f110e0Safresh1$r = '';
7791f110e0Safresh1for my $i (@array) {
7891f110e0Safresh1    $r .= $i;
7991f110e0Safresh1}
8091f110e0Safresh1is ($r, 'ABC', 'Forwards for array with var');
8191f110e0Safresh1$r = '';
8291f110e0Safresh1for my $i (1,2,3) {
8391f110e0Safresh1    $r .= $i;
8491f110e0Safresh1}
8591f110e0Safresh1is ($r, '123', 'Forwards for list with var');
8691f110e0Safresh1$r = '';
8791f110e0Safresh1for my $i (map {$_} @array) {
8891f110e0Safresh1    $r .= $i;
8991f110e0Safresh1}
9091f110e0Safresh1is ($r, 'ABC', 'Forwards for array via map with var');
9191f110e0Safresh1$r = '';
9291f110e0Safresh1for my $i (map {$_} 1,2,3) {
9391f110e0Safresh1    $r .= $i;
9491f110e0Safresh1}
9591f110e0Safresh1is ($r, '123', 'Forwards for list via map with var');
9691f110e0Safresh1$r = '';
9791f110e0Safresh1for my $i (1 .. 3) {
9891f110e0Safresh1    $r .= $i;
9991f110e0Safresh1}
10091f110e0Safresh1is ($r, '123', 'Forwards for list via .. with var');
10191f110e0Safresh1$r = '';
10291f110e0Safresh1for my $i ('A' .. 'C') {
10391f110e0Safresh1    $r .= $i;
10491f110e0Safresh1}
10591f110e0Safresh1is ($r, 'ABC', 'Forwards for list via .. with var');
10691f110e0Safresh1
10791f110e0Safresh1$r = '';
10891f110e0Safresh1for my $i (reverse @array) {
10991f110e0Safresh1    $r .= $i;
11091f110e0Safresh1}
11191f110e0Safresh1is ($r, 'CBA', 'Reverse for array with var');
11291f110e0Safresh1$r = '';
11391f110e0Safresh1for my $i (reverse 1,2,3) {
11491f110e0Safresh1    $r .= $i;
11591f110e0Safresh1}
11691f110e0Safresh1is ($r, '321', 'Reverse for list with var');
11791f110e0Safresh1$r = '';
11891f110e0Safresh1for my $i (reverse map {$_} @array) {
11991f110e0Safresh1    $r .= $i;
12091f110e0Safresh1}
12191f110e0Safresh1is ($r, 'CBA', 'Reverse for array via map with var');
12291f110e0Safresh1$r = '';
12391f110e0Safresh1for my $i (reverse map {$_} 1,2,3) {
12491f110e0Safresh1    $r .= $i;
12591f110e0Safresh1}
12691f110e0Safresh1is ($r, '321', 'Reverse for list via map with var');
12791f110e0Safresh1$r = '';
12891f110e0Safresh1for my $i (reverse 1 .. 3) {
12991f110e0Safresh1    $r .= $i;
13091f110e0Safresh1}
13191f110e0Safresh1is ($r, '321', 'Reverse for list via .. with var');
13291f110e0Safresh1$r = '';
13391f110e0Safresh1for my $i (reverse 'A' .. 'C') {
13491f110e0Safresh1    $r .= $i;
13591f110e0Safresh1}
13691f110e0Safresh1is ($r, 'CBA', 'Reverse for list via .. with var');
13791f110e0Safresh1
13891f110e0Safresh1# For some reason the generate optree is different when $_ is implicit.
13991f110e0Safresh1$r = '';
14091f110e0Safresh1for $_ (@array) {
14191f110e0Safresh1    $r .= $_;
14291f110e0Safresh1}
14391f110e0Safresh1is ($r, 'ABC', 'Forwards for array with explicit $_');
14491f110e0Safresh1$r = '';
14591f110e0Safresh1for $_ (1,2,3) {
14691f110e0Safresh1    $r .= $_;
14791f110e0Safresh1}
14891f110e0Safresh1is ($r, '123', 'Forwards for list with explicit $_');
14991f110e0Safresh1$r = '';
15091f110e0Safresh1for $_ (map {$_} @array) {
15191f110e0Safresh1    $r .= $_;
15291f110e0Safresh1}
15391f110e0Safresh1is ($r, 'ABC', 'Forwards for array via map with explicit $_');
15491f110e0Safresh1$r = '';
15591f110e0Safresh1for $_ (map {$_} 1,2,3) {
15691f110e0Safresh1    $r .= $_;
15791f110e0Safresh1}
15891f110e0Safresh1is ($r, '123', 'Forwards for list via map with explicit $_');
15991f110e0Safresh1$r = '';
16091f110e0Safresh1for $_ (1 .. 3) {
16191f110e0Safresh1    $r .= $_;
16291f110e0Safresh1}
16391f110e0Safresh1is ($r, '123', 'Forwards for list via .. with var with explicit $_');
16491f110e0Safresh1$r = '';
16591f110e0Safresh1for $_ ('A' .. 'C') {
16691f110e0Safresh1    $r .= $_;
16791f110e0Safresh1}
16891f110e0Safresh1is ($r, 'ABC', 'Forwards for list via .. with var with explicit $_');
16991f110e0Safresh1
17091f110e0Safresh1$r = '';
17191f110e0Safresh1for $_ (reverse @array) {
17291f110e0Safresh1    $r .= $_;
17391f110e0Safresh1}
17491f110e0Safresh1is ($r, 'CBA', 'Reverse for array with explicit $_');
17591f110e0Safresh1$r = '';
17691f110e0Safresh1for $_ (reverse 1,2,3) {
17791f110e0Safresh1    $r .= $_;
17891f110e0Safresh1}
17991f110e0Safresh1is ($r, '321', 'Reverse for list with explicit $_');
18091f110e0Safresh1$r = '';
18191f110e0Safresh1for $_ (reverse map {$_} @array) {
18291f110e0Safresh1    $r .= $_;
18391f110e0Safresh1}
18491f110e0Safresh1is ($r, 'CBA', 'Reverse for array via map with explicit $_');
18591f110e0Safresh1$r = '';
18691f110e0Safresh1for $_ (reverse map {$_} 1,2,3) {
18791f110e0Safresh1    $r .= $_;
18891f110e0Safresh1}
18991f110e0Safresh1is ($r, '321', 'Reverse for list via map with explicit $_');
19091f110e0Safresh1$r = '';
19191f110e0Safresh1for $_ (reverse 1 .. 3) {
19291f110e0Safresh1    $r .= $_;
19391f110e0Safresh1}
19491f110e0Safresh1is ($r, '321', 'Reverse for list via .. with var with explicit $_');
19591f110e0Safresh1$r = '';
19691f110e0Safresh1for $_ (reverse 'A' .. 'C') {
19791f110e0Safresh1    $r .= $_;
19891f110e0Safresh1}
19991f110e0Safresh1is ($r, 'CBA', 'Reverse for list via .. with var with explicit $_');
20091f110e0Safresh1
20191f110e0Safresh1# I don't think that my is that different from our in the optree. But test a
20291f110e0Safresh1# few:
20391f110e0Safresh1$r = '';
20491f110e0Safresh1for our $i (reverse @array) {
20591f110e0Safresh1    $r .= $i;
20691f110e0Safresh1}
20791f110e0Safresh1is ($r, 'CBA', 'Reverse for array with our var');
20891f110e0Safresh1$r = '';
20991f110e0Safresh1for our $i (reverse 1,2,3) {
21091f110e0Safresh1    $r .= $i;
21191f110e0Safresh1}
21291f110e0Safresh1is ($r, '321', 'Reverse for list with our var');
21391f110e0Safresh1$r = '';
21491f110e0Safresh1for our $i (reverse map {$_} @array) {
21591f110e0Safresh1    $r .= $i;
21691f110e0Safresh1}
21791f110e0Safresh1is ($r, 'CBA', 'Reverse for array via map with our var');
21891f110e0Safresh1$r = '';
21991f110e0Safresh1for our $i (reverse map {$_} 1,2,3) {
22091f110e0Safresh1    $r .= $i;
22191f110e0Safresh1}
22291f110e0Safresh1is ($r, '321', 'Reverse for list via map with our var');
22391f110e0Safresh1$r = '';
22491f110e0Safresh1for our $i (reverse 1 .. 3) {
22591f110e0Safresh1    $r .= $i;
22691f110e0Safresh1}
22791f110e0Safresh1is ($r, '321', 'Reverse for list via .. with our var');
22891f110e0Safresh1$r = '';
22991f110e0Safresh1for our $i (reverse 'A' .. 'C') {
23091f110e0Safresh1    $r .= $i;
23191f110e0Safresh1}
23291f110e0Safresh1is ($r, 'CBA', 'Reverse for list via .. with our var');
23391f110e0Safresh1
23491f110e0Safresh1
23591f110e0Safresh1$r = '';
23691f110e0Safresh1for (1, reverse @array) {
23791f110e0Safresh1    $r .= $_;
23891f110e0Safresh1}
23991f110e0Safresh1is ($r, '1CBA', 'Reverse for array with leading value');
24091f110e0Safresh1$r = '';
24191f110e0Safresh1for ('A', reverse 1,2,3) {
24291f110e0Safresh1    $r .= $_;
24391f110e0Safresh1}
24491f110e0Safresh1is ($r, 'A321', 'Reverse for list with leading value');
24591f110e0Safresh1$r = '';
24691f110e0Safresh1for (1, reverse map {$_} @array) {
24791f110e0Safresh1    $r .= $_;
24891f110e0Safresh1}
24991f110e0Safresh1is ($r, '1CBA', 'Reverse for array via map with leading value');
25091f110e0Safresh1$r = '';
25191f110e0Safresh1for ('A', reverse map {$_} 1,2,3) {
25291f110e0Safresh1    $r .= $_;
25391f110e0Safresh1}
25491f110e0Safresh1is ($r, 'A321', 'Reverse for list via map with leading value');
25591f110e0Safresh1$r = '';
25691f110e0Safresh1for ('A', reverse 1 .. 3) {
25791f110e0Safresh1    $r .= $_;
25891f110e0Safresh1}
25991f110e0Safresh1is ($r, 'A321', 'Reverse for list via .. with leading value');
26091f110e0Safresh1$r = '';
26191f110e0Safresh1for (1, reverse 'A' .. 'C') {
26291f110e0Safresh1    $r .= $_;
26391f110e0Safresh1}
26491f110e0Safresh1is ($r, '1CBA', 'Reverse for list via .. with leading value');
26591f110e0Safresh1
26691f110e0Safresh1$r = '';
26791f110e0Safresh1for (reverse (@array), 1) {
26891f110e0Safresh1    $r .= $_;
26991f110e0Safresh1}
27091f110e0Safresh1is ($r, 'CBA1', 'Reverse for array with trailing value');
27191f110e0Safresh1$r = '';
27291f110e0Safresh1for (reverse (1,2,3), 'A') {
27391f110e0Safresh1    $r .= $_;
27491f110e0Safresh1}
27591f110e0Safresh1is ($r, '321A', 'Reverse for list with trailing value');
27691f110e0Safresh1$r = '';
27791f110e0Safresh1for (reverse (map {$_} @array), 1) {
27891f110e0Safresh1    $r .= $_;
27991f110e0Safresh1}
28091f110e0Safresh1is ($r, 'CBA1', 'Reverse for array via map with trailing value');
28191f110e0Safresh1$r = '';
28291f110e0Safresh1for (reverse (map {$_} 1,2,3), 'A') {
28391f110e0Safresh1    $r .= $_;
28491f110e0Safresh1}
28591f110e0Safresh1is ($r, '321A', 'Reverse for list via map with trailing value');
28691f110e0Safresh1$r = '';
28791f110e0Safresh1for (reverse (1 .. 3), 'A') {
28891f110e0Safresh1    $r .= $_;
28991f110e0Safresh1}
29091f110e0Safresh1is ($r, '321A', 'Reverse for list via .. with trailing value');
29191f110e0Safresh1$r = '';
29291f110e0Safresh1for (reverse ('A' .. 'C'), 1) {
29391f110e0Safresh1    $r .= $_;
29491f110e0Safresh1}
29591f110e0Safresh1is ($r, 'CBA1', 'Reverse for list via .. with trailing value');
29691f110e0Safresh1
29791f110e0Safresh1
29891f110e0Safresh1$r = '';
29991f110e0Safresh1for $_ (1, reverse @array) {
30091f110e0Safresh1    $r .= $_;
30191f110e0Safresh1}
30291f110e0Safresh1is ($r, '1CBA', 'Reverse for array with leading value with explicit $_');
30391f110e0Safresh1$r = '';
30491f110e0Safresh1for $_ ('A', reverse 1,2,3) {
30591f110e0Safresh1    $r .= $_;
30691f110e0Safresh1}
30791f110e0Safresh1is ($r, 'A321', 'Reverse for list with leading value with explicit $_');
30891f110e0Safresh1$r = '';
30991f110e0Safresh1for $_ (1, reverse map {$_} @array) {
31091f110e0Safresh1    $r .= $_;
31191f110e0Safresh1}
31291f110e0Safresh1is ($r, '1CBA',
31391f110e0Safresh1    'Reverse for array via map with leading value with explicit $_');
31491f110e0Safresh1$r = '';
31591f110e0Safresh1for $_ ('A', reverse map {$_} 1,2,3) {
31691f110e0Safresh1    $r .= $_;
31791f110e0Safresh1}
31891f110e0Safresh1is ($r, 'A321', 'Reverse for list via map with leading value with explicit $_');
31991f110e0Safresh1$r = '';
32091f110e0Safresh1for $_ ('A', reverse 1 .. 3) {
32191f110e0Safresh1    $r .= $_;
32291f110e0Safresh1}
32391f110e0Safresh1is ($r, 'A321', 'Reverse for list via .. with leading value with explicit $_');
32491f110e0Safresh1$r = '';
32591f110e0Safresh1for $_ (1, reverse 'A' .. 'C') {
32691f110e0Safresh1    $r .= $_;
32791f110e0Safresh1}
32891f110e0Safresh1is ($r, '1CBA', 'Reverse for list via .. with leading value with explicit $_');
32991f110e0Safresh1
33091f110e0Safresh1$r = '';
33191f110e0Safresh1for $_ (reverse (@array), 1) {
33291f110e0Safresh1    $r .= $_;
33391f110e0Safresh1}
33491f110e0Safresh1is ($r, 'CBA1', 'Reverse for array with trailing value with explicit $_');
33591f110e0Safresh1$r = '';
33691f110e0Safresh1for $_ (reverse (1,2,3), 'A') {
33791f110e0Safresh1    $r .= $_;
33891f110e0Safresh1}
33991f110e0Safresh1is ($r, '321A', 'Reverse for list with trailing value with explicit $_');
34091f110e0Safresh1$r = '';
34191f110e0Safresh1for $_ (reverse (map {$_} @array), 1) {
34291f110e0Safresh1    $r .= $_;
34391f110e0Safresh1}
34491f110e0Safresh1is ($r, 'CBA1',
34591f110e0Safresh1    'Reverse for array via map with trailing value with explicit $_');
34691f110e0Safresh1$r = '';
34791f110e0Safresh1for $_ (reverse (map {$_} 1,2,3), 'A') {
34891f110e0Safresh1    $r .= $_;
34991f110e0Safresh1}
35091f110e0Safresh1is ($r, '321A',
35191f110e0Safresh1    'Reverse for list via map with trailing value with explicit $_');
35291f110e0Safresh1$r = '';
35391f110e0Safresh1for $_ (reverse (1 .. 3), 'A') {
35491f110e0Safresh1    $r .= $_;
35591f110e0Safresh1}
35691f110e0Safresh1is ($r, '321A', 'Reverse for list via .. with trailing value with explicit $_');
35791f110e0Safresh1$r = '';
35891f110e0Safresh1for $_ (reverse ('A' .. 'C'), 1) {
35991f110e0Safresh1    $r .= $_;
36091f110e0Safresh1}
36191f110e0Safresh1is ($r, 'CBA1', 'Reverse for list via .. with trailing value with explicit $_');
36291f110e0Safresh1
36391f110e0Safresh1$r = '';
36491f110e0Safresh1for my $i (1, reverse @array) {
36591f110e0Safresh1    $r .= $i;
36691f110e0Safresh1}
36791f110e0Safresh1is ($r, '1CBA', 'Reverse for array with leading value and var');
36891f110e0Safresh1$r = '';
36991f110e0Safresh1for my $i ('A', reverse 1,2,3) {
37091f110e0Safresh1    $r .= $i;
37191f110e0Safresh1}
37291f110e0Safresh1is ($r, 'A321', 'Reverse for list with leading value and var');
37391f110e0Safresh1$r = '';
37491f110e0Safresh1for my $i (1, reverse map {$_} @array) {
37591f110e0Safresh1    $r .= $i;
37691f110e0Safresh1}
37791f110e0Safresh1is ($r, '1CBA', 'Reverse for array via map with leading value and var');
37891f110e0Safresh1$r = '';
37991f110e0Safresh1for my $i ('A', reverse map {$_} 1,2,3) {
38091f110e0Safresh1    $r .= $i;
38191f110e0Safresh1}
38291f110e0Safresh1is ($r, 'A321', 'Reverse for list via map with leading value and var');
38391f110e0Safresh1$r = '';
38491f110e0Safresh1for my $i ('A', reverse 1 .. 3) {
38591f110e0Safresh1    $r .= $i;
38691f110e0Safresh1}
38791f110e0Safresh1is ($r, 'A321', 'Reverse for list via .. with leading value and var');
38891f110e0Safresh1$r = '';
38991f110e0Safresh1for my $i (1, reverse 'A' .. 'C') {
39091f110e0Safresh1    $r .= $i;
39191f110e0Safresh1}
39291f110e0Safresh1is ($r, '1CBA', 'Reverse for list via .. with leading value and var');
39391f110e0Safresh1
39491f110e0Safresh1$r = '';
39591f110e0Safresh1for my $i (reverse (@array), 1) {
39691f110e0Safresh1    $r .= $i;
39791f110e0Safresh1}
39891f110e0Safresh1is ($r, 'CBA1', 'Reverse for array with trailing value and var');
39991f110e0Safresh1$r = '';
40091f110e0Safresh1for my $i (reverse (1,2,3), 'A') {
40191f110e0Safresh1    $r .= $i;
40291f110e0Safresh1}
40391f110e0Safresh1is ($r, '321A', 'Reverse for list with trailing value and var');
40491f110e0Safresh1$r = '';
40591f110e0Safresh1for my $i (reverse (map {$_} @array), 1) {
40691f110e0Safresh1    $r .= $i;
40791f110e0Safresh1}
40891f110e0Safresh1is ($r, 'CBA1', 'Reverse for array via map with trailing value and var');
40991f110e0Safresh1$r = '';
41091f110e0Safresh1for my $i (reverse (map {$_} 1,2,3), 'A') {
41191f110e0Safresh1    $r .= $i;
41291f110e0Safresh1}
41391f110e0Safresh1is ($r, '321A', 'Reverse for list via map with trailing value and var');
41491f110e0Safresh1$r = '';
41591f110e0Safresh1for my $i (reverse (1 .. 3), 'A') {
41691f110e0Safresh1    $r .= $i;
41791f110e0Safresh1}
41891f110e0Safresh1is ($r, '321A', 'Reverse for list via .. with trailing value and var');
41991f110e0Safresh1$r = '';
42091f110e0Safresh1for my $i (reverse ('A' .. 'C'), 1) {
42191f110e0Safresh1    $r .= $i;
42291f110e0Safresh1}
42391f110e0Safresh1is ($r, 'CBA1', 'Reverse for list via .. with trailing value and var');
42491f110e0Safresh1
42591f110e0Safresh1
42691f110e0Safresh1$r = '';
42791f110e0Safresh1for (reverse 1, @array) {
42891f110e0Safresh1    $r .= $_;
42991f110e0Safresh1}
43091f110e0Safresh1is ($r, 'CBA1', 'Reverse for value and array');
43191f110e0Safresh1$r = '';
43291f110e0Safresh1for (reverse map {$_} 1, @array) {
43391f110e0Safresh1    $r .= $_;
43491f110e0Safresh1}
43591f110e0Safresh1is ($r, 'CBA1', 'Reverse for value and array via map');
43691f110e0Safresh1$r = '';
43791f110e0Safresh1for (reverse 1 .. 3, @array) {
43891f110e0Safresh1    $r .= $_;
43991f110e0Safresh1}
44091f110e0Safresh1is ($r, 'CBA321', 'Reverse for .. and array');
44191f110e0Safresh1$r = '';
44291f110e0Safresh1for (reverse 'X' .. 'Z', @array) {
44391f110e0Safresh1    $r .= $_;
44491f110e0Safresh1}
44591f110e0Safresh1is ($r, 'CBAZYX', 'Reverse for .. and array');
44691f110e0Safresh1$r = '';
44791f110e0Safresh1for (reverse map {$_} 1 .. 3, @array) {
44891f110e0Safresh1    $r .= $_;
44991f110e0Safresh1}
45091f110e0Safresh1is ($r, 'CBA321', 'Reverse for .. and array via map');
45191f110e0Safresh1$r = '';
45291f110e0Safresh1for (reverse map {$_} 'X' .. 'Z', @array) {
45391f110e0Safresh1    $r .= $_;
45491f110e0Safresh1}
45591f110e0Safresh1is ($r, 'CBAZYX', 'Reverse for .. and array via map');
45691f110e0Safresh1
45791f110e0Safresh1$r = '';
45891f110e0Safresh1for (reverse (@array, 1)) {
45991f110e0Safresh1    $r .= $_;
46091f110e0Safresh1}
46191f110e0Safresh1is ($r, '1CBA', 'Reverse for array and value');
46291f110e0Safresh1$r = '';
46391f110e0Safresh1for (reverse (map {$_} @array, 1)) {
46491f110e0Safresh1    $r .= $_;
46591f110e0Safresh1}
46691f110e0Safresh1is ($r, '1CBA', 'Reverse for array and value via map');
46791f110e0Safresh1
46891f110e0Safresh1$r = '';
46991f110e0Safresh1for $_ (reverse 1, @array) {
47091f110e0Safresh1    $r .= $_;
47191f110e0Safresh1}
47291f110e0Safresh1is ($r, 'CBA1', 'Reverse for value and array with explicit $_');
47391f110e0Safresh1$r = '';
47491f110e0Safresh1for $_ (reverse map {$_} 1, @array) {
47591f110e0Safresh1    $r .= $_;
47691f110e0Safresh1}
47791f110e0Safresh1is ($r, 'CBA1', 'Reverse for value and array via map with explicit $_');
47891f110e0Safresh1$r = '';
47991f110e0Safresh1for $_ (reverse 1 .. 3, @array) {
48091f110e0Safresh1    $r .= $_;
48191f110e0Safresh1}
48291f110e0Safresh1is ($r, 'CBA321', 'Reverse for .. and array with explicit $_');
48391f110e0Safresh1$r = '';
48491f110e0Safresh1for $_ (reverse 'X' .. 'Z', @array) {
48591f110e0Safresh1    $r .= $_;
48691f110e0Safresh1}
48791f110e0Safresh1is ($r, 'CBAZYX', 'Reverse for .. and array with explicit $_');
48891f110e0Safresh1$r = '';
48991f110e0Safresh1for $_ (reverse map {$_} 1 .. 3, @array) {
49091f110e0Safresh1    $r .= $_;
49191f110e0Safresh1}
49291f110e0Safresh1is ($r, 'CBA321', 'Reverse for .. and array via map with explicit $_');
49391f110e0Safresh1$r = '';
49491f110e0Safresh1for $_ (reverse map {$_} 'X' .. 'Z', @array) {
49591f110e0Safresh1    $r .= $_;
49691f110e0Safresh1}
49791f110e0Safresh1is ($r, 'CBAZYX', 'Reverse for .. and array via map with explicit $_');
49891f110e0Safresh1
49991f110e0Safresh1$r = '';
50091f110e0Safresh1for $_ (reverse (@array, 1)) {
50191f110e0Safresh1    $r .= $_;
50291f110e0Safresh1}
50391f110e0Safresh1is ($r, '1CBA', 'Reverse for array and value with explicit $_');
50491f110e0Safresh1$r = '';
50591f110e0Safresh1for $_ (reverse (map {$_} @array, 1)) {
50691f110e0Safresh1    $r .= $_;
50791f110e0Safresh1}
50891f110e0Safresh1is ($r, '1CBA', 'Reverse for array and value via map with explicit $_');
50991f110e0Safresh1
51091f110e0Safresh1
51191f110e0Safresh1$r = '';
51291f110e0Safresh1for my $i (reverse 1, @array) {
51391f110e0Safresh1    $r .= $i;
51491f110e0Safresh1}
51591f110e0Safresh1is ($r, 'CBA1', 'Reverse for value and array with var');
51691f110e0Safresh1$r = '';
51791f110e0Safresh1for my $i (reverse map {$_} 1, @array) {
51891f110e0Safresh1    $r .= $i;
51991f110e0Safresh1}
52091f110e0Safresh1is ($r, 'CBA1', 'Reverse for value and array via map with var');
52191f110e0Safresh1$r = '';
52291f110e0Safresh1for my $i (reverse 1 .. 3, @array) {
52391f110e0Safresh1    $r .= $i;
52491f110e0Safresh1}
52591f110e0Safresh1is ($r, 'CBA321', 'Reverse for .. and array with var');
52691f110e0Safresh1$r = '';
52791f110e0Safresh1for my $i (reverse 'X' .. 'Z', @array) {
52891f110e0Safresh1    $r .= $i;
52991f110e0Safresh1}
53091f110e0Safresh1is ($r, 'CBAZYX', 'Reverse for .. and array with var');
53191f110e0Safresh1$r = '';
53291f110e0Safresh1for my $i (reverse map {$_} 1 .. 3, @array) {
53391f110e0Safresh1    $r .= $i;
53491f110e0Safresh1}
53591f110e0Safresh1is ($r, 'CBA321', 'Reverse for .. and array via map with var');
53691f110e0Safresh1$r = '';
53791f110e0Safresh1for my $i (reverse map {$_} 'X' .. 'Z', @array) {
53891f110e0Safresh1    $r .= $i;
53991f110e0Safresh1}
54091f110e0Safresh1is ($r, 'CBAZYX', 'Reverse for .. and array via map with var');
54191f110e0Safresh1
54291f110e0Safresh1$r = '';
54391f110e0Safresh1for my $i (reverse (@array, 1)) {
54491f110e0Safresh1    $r .= $i;
54591f110e0Safresh1}
54691f110e0Safresh1is ($r, '1CBA', 'Reverse for array and value with var');
54791f110e0Safresh1$r = '';
54891f110e0Safresh1for my $i (reverse (map {$_} @array, 1)) {
54991f110e0Safresh1    $r .= $i;
55091f110e0Safresh1}
55191f110e0Safresh1is ($r, '1CBA', 'Reverse for array and value via map with var');
55291f110e0Safresh1
553eac174f2Safresh1{
554eac174f2Safresh1    no warnings 'void';
555eac174f2Safresh1    is (do {17; foreach (1, 2) { 1; } }, "",
556eac174f2Safresh1        "RT #1085: what should be output of perl -we 'print do { foreach (1, 2) { 1; } }'");
557eac174f2Safresh1}
55891f110e0Safresh1
55991f110e0Safresh1TODO: {
56091f110e0Safresh1    local $TODO = "RT #2166: foreach spuriously autovivifies";
56191f110e0Safresh1    my %h;
562eac174f2Safresh1    foreach (@h{'a', 'b'}) {}
5639f11ffb7Safresh1    is keys(%h), 0, 'RT #2166: foreach spuriously autovivifies';
56491f110e0Safresh1}
5656fb12b70Safresh1
5666fb12b70Safresh1sub {
5676fb12b70Safresh1    foreach (@_) {
5686fb12b70Safresh1        is eval { \$_ }, \undef, 'foreach (@array_containing_undef)'
5696fb12b70Safresh1    }
5706fb12b70Safresh1}->(undef);
5716fb12b70Safresh1
5726fb12b70Safresh1SKIP: {
5736fb12b70Safresh1    skip "No XS::APItest under miniperl", 1, if is_miniperl;
5746fb12b70Safresh1    skip "no XS::APItest", 1 if !eval { require XS::APItest };
5756fb12b70Safresh1    my @a;
5766fb12b70Safresh1    sub {
5776fb12b70Safresh1        XS::APItest::alias_av(\@a, 0, undef);
5786fb12b70Safresh1        eval { \$_[0] }
5796fb12b70Safresh1    }->($a[0]);
5806fb12b70Safresh1    is $@, "", 'vivify_defelem does not croak on &PL_sv_undef elements';
5816fb12b70Safresh1}
582b8851fccSafresh1
583b8851fccSafresh1for $x ($y) {
584b8851fccSafresh1    $x = 3;
585b8851fccSafresh1    ($x, my $z) = (1, $y);
586b8851fccSafresh1    is $z, 3, 'list assignment after aliasing via foreach';
587b8851fccSafresh1}
588b8851fccSafresh1
589b8851fccSafresh1for my $x (my $y) {
590b8851fccSafresh1    $x = 3;
591b8851fccSafresh1    ($x, my $z) = (1, $y);
592b8851fccSafresh1    is $z, 3, 'list assignment after aliasing lexical var via foreach';
593b8851fccSafresh1}
594b8851fccSafresh1
595b8851fccSafresh1@_ = ();
596b8851fccSafresh1@_ = (1,2,3,scalar do{for(@_){}} + 1, 4, 5, 6);
597b8851fccSafresh1is "@_", "1 2 3 1 4 5 6",
598b8851fccSafresh1   '[perl #124004] scalar for(@empty_array) stack bug';
599b8851fccSafresh1
600b8851fccSafresh1# DAPM: while messing with the scope code, I broke some cpan/ code,
601b8851fccSafresh1# but surprisingly didn't break any dedicated tests. So test it:
602b8851fccSafresh1
603b8851fccSafresh1sub fscope {
604b8851fccSafresh1    for my $y (1,2) {
605b8851fccSafresh1	my $a = $y;
606b8851fccSafresh1	return $a;
607b8851fccSafresh1    }
608b8851fccSafresh1}
609b8851fccSafresh1
610b8851fccSafresh1is(fscope(), 1, 'return via loop in sub');
611b8851fccSafresh1
612b8851fccSafresh1# make sure a NULL GvSV is restored at the end of the loop
613b8851fccSafresh1
614b8851fccSafresh1{
615b8851fccSafresh1    local $foo = "boo";
616b8851fccSafresh1    {
617b8851fccSafresh1        local *foo;
618b8851fccSafresh1        for $foo (1,2) {}
619b8851fccSafresh1        ok(!defined $foo, "NULL GvSV");
620b8851fccSafresh1    }
621b8851fccSafresh1}
622b8851fccSafresh1
623b8851fccSafresh1# make sure storing an int in a NULL GvSV is ok
624b8851fccSafresh1
625b8851fccSafresh1{
626b8851fccSafresh1    local $foo = "boo";
627b8851fccSafresh1    {
628b8851fccSafresh1        local *foo;
629b8851fccSafresh1        for $foo (1..2) {}
630b8851fccSafresh1        ok(!defined $foo, "NULL GvSV int iterator");
631b8851fccSafresh1    }
632b8851fccSafresh1}
633b8851fccSafresh1
634b8851fccSafresh1# RT #123994 - handle a null GVSV within a loop
635b8851fccSafresh1
636b8851fccSafresh1{
637b8851fccSafresh1    local *foo;
638b8851fccSafresh1    local $foo = "outside";
639b8851fccSafresh1
640b8851fccSafresh1    my $i = 0;
641b8851fccSafresh1    for $foo (0..1) {
642b8851fccSafresh1        is($foo, $i, "RT #123994 int range $i");
643b8851fccSafresh1        *foo = "";
644b8851fccSafresh1        $i++;
645b8851fccSafresh1    }
646b8851fccSafresh1    is($foo, "outside", "RT #123994 int range outside");
647b8851fccSafresh1
648b8851fccSafresh1    $i = 0;
649b8851fccSafresh1    for $foo ('0'..'1') {
650b8851fccSafresh1        is($foo, $i, "RT #123994 str range $i");
651b8851fccSafresh1        *foo = "";
652b8851fccSafresh1        $i++;
653b8851fccSafresh1    }
654b8851fccSafresh1    is($foo, "outside", "RT #123994 str range outside");
655b8851fccSafresh1
656b8851fccSafresh1    $i = 0;
657b8851fccSafresh1    for $foo (0, 1) {
658b8851fccSafresh1        is($foo, $i, "RT #123994 list $i");
659b8851fccSafresh1        *foo = "";
660b8851fccSafresh1        $i++;
661b8851fccSafresh1    }
662b8851fccSafresh1    is($foo, "outside", "RT #123994 list outside");
663b8851fccSafresh1
664b8851fccSafresh1    my @a = (0,1);
665b8851fccSafresh1    $i = 0;
666b8851fccSafresh1    for $foo (@a) {
667b8851fccSafresh1        is($foo, $i, "RT #123994 array $i");
668b8851fccSafresh1        *foo = "";
669b8851fccSafresh1        $i++;
670b8851fccSafresh1    }
671b8851fccSafresh1    is($foo, "outside", "RT #123994 array outside");
672b8851fccSafresh1}
673e603c72fSafresh1
674e603c72fSafresh1# RT #133558 'reverse' under AIX was causing loop to terminate
675e603c72fSafresh1# immediately, probably due to compiler bug
676e603c72fSafresh1
677e603c72fSafresh1{
678e603c72fSafresh1    my @a = qw(foo);
679e603c72fSafresh1    my @b;
680e603c72fSafresh1    push @b, $_ for (reverse @a);
681e603c72fSafresh1    is "@b", "foo", " RT #133558 reverse array";
682e603c72fSafresh1
683e603c72fSafresh1    @b = ();
684e603c72fSafresh1    push @b, $_ for (reverse 'bar');
685e603c72fSafresh1    is "@b", "bar", " RT #133558 reverse list";
686e603c72fSafresh1}
687eac174f2Safresh1
688eac174f2Safresh1{
689eac174f2Safresh1    my @numbers = 0..2;
690eac174f2Safresh1    for my $i (@numbers) {
691eac174f2Safresh1        ++$i;
692eac174f2Safresh1    }
693eac174f2Safresh1    is("@numbers", '1 2 3', 'for iterators are aliases');
694eac174f2Safresh1
695eac174f2Safresh1    my @letters = qw(a b c);
696eac174f2Safresh1
697eac174f2Safresh1    for my $i (@numbers, @letters) {
698eac174f2Safresh1        ++$i;
699eac174f2Safresh1    }
700eac174f2Safresh1    is("@numbers", '2 3 4', 'iterate on two arrays together one');
701eac174f2Safresh1    is("@letters", 'b c d', 'iterate on two arrays together two');
702eac174f2Safresh1
703eac174f2Safresh1    my $got = eval {
704eac174f2Safresh1        for my $i (@letters, undef, @numbers) {
705eac174f2Safresh1            ++$i;
706eac174f2Safresh1        }
707eac174f2Safresh1        1;
708eac174f2Safresh1    };
709eac174f2Safresh1    is($got, undef, 'aliased rvalue');
710eac174f2Safresh1    like($@, qr/^Modification of a read-only value attempted/,
711eac174f2Safresh1         'aliased rvalue threw the correct exception');
712eac174f2Safresh1
713eac174f2Safresh1    is("@letters", 'c d e', 'letters were incremented');
714eac174f2Safresh1    is("@numbers", '2 3 4', 'numbers were not');
715eac174f2Safresh1
716eac174f2Safresh1    for my $i (@numbers[0, 1, 0]) {
717eac174f2Safresh1        ++$i;
718eac174f2Safresh1    }
719eac174f2Safresh1    is("@numbers", '4 4 4', 'array slices are lvalues');
720eac174f2Safresh1}
721eac174f2Safresh1
722eac174f2Safresh1# It turns out that these are legal. Whether they should be is another matter.
723eac174f2Safresh1
724eac174f2Safresh1{
725eac174f2Safresh1    my @opinion = qw(Emergent Behaviour);
726eac174f2Safresh1    my @observation;
727eac174f2Safresh1    for CORE::my $var (@opinion) {
728eac174f2Safresh1        push @observation, $var;
729eac174f2Safresh1    }
730eac174f2Safresh1    is("@observation", "@opinion", 'for CORE::my $oh_my_oh_my ...');
731eac174f2Safresh1
732eac174f2Safresh1    @observation = ();
733eac174f2Safresh1    for CORE::our $var (@opinion) {
734eac174f2Safresh1        push @observation, $var;
735eac174f2Safresh1    }
736eac174f2Safresh1    is("@observation", "@opinion", 'for CORE::our $var ...');
737eac174f2Safresh1
738eac174f2Safresh1}
739eac174f2Safresh1
740eac174f2Safresh1# Likewise, we have this inconsistency currently:
741eac174f2Safresh1{
742eac174f2Safresh1    use feature "state";
743eac174f2Safresh1    ++$Dog::VERSION;
744eac174f2Safresh1
745eac174f2Safresh1    for my $token (qw(my our)) {
746eac174f2Safresh1        my $code = "for $token Dog \$spot ('Woof') { } 42";
747eac174f2Safresh1        is(eval $code, 42, "$code is valid");
748eac174f2Safresh1        is($@, "", "$code had no errors");
749eac174f2Safresh1    }
750eac174f2Safresh1
751eac174f2Safresh1    # But these are all invalid:
752eac174f2Safresh1    for my $token (qw(CORE::my CORE::our CORE::state state)) {
753eac174f2Safresh1        my $code = "for $token Dog \$spot ('Woof') { } 42 ";
754eac174f2Safresh1        is(eval $code, undef, "$code is not valid");
755eac174f2Safresh1        like($@, qr/^Missing \$ on loop variable/, "$code had emergent error");
756eac174f2Safresh1    }
757eac174f2Safresh1}
758eac174f2Safresh1
759*e0680481Safresh1# the GV of the loop variable didn't have its refcount bumped while being
760*e0680481Safresh1# used by the loop, so it was possible to free it mid-loop.  This used to
761*e0680481Safresh1# assert/SEGV
762*e0680481Safresh1
763*e0680481Safresh1{
764*e0680481Safresh1    my $f = "a_low_refcnt_package_var";
765*e0680481Safresh1    my $i = 0;
766*e0680481Safresh1    no strict 'refs';
767*e0680481Safresh1    for ${*$f} (5,11,33) {
768*e0680481Safresh1        delete $main::{$f};
769*e0680481Safresh1        $i++;
770*e0680481Safresh1    }
771*e0680481Safresh1    is($i, 3, "deleting glob is safe");
772*e0680481Safresh1}
773*e0680481Safresh1
774*e0680481Safresh1
775eac174f2Safresh1done_testing();
776