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