xref: /openbsd/gnu/usr.bin/perl/t/op/for.t (revision e5dd7070)
1#!./perl
2
3BEGIN {
4    chdir 't' if -d 't';
5    require "./test.pl";
6}
7
8plan(126);
9
10# A lot of tests to check that reversed for works.
11
12@array = ('A', 'B', 'C');
13for (@array) {
14    $r .= $_;
15}
16is ($r, 'ABC', 'Forwards for array');
17$r = '';
18for (1,2,3) {
19    $r .= $_;
20}
21is ($r, '123', 'Forwards for list');
22$r = '';
23for (map {$_} @array) {
24    $r .= $_;
25}
26is ($r, 'ABC', 'Forwards for array via map');
27$r = '';
28for (map {$_} 1,2,3) {
29    $r .= $_;
30}
31is ($r, '123', 'Forwards for list via map');
32$r = '';
33for (1 .. 3) {
34    $r .= $_;
35}
36is ($r, '123', 'Forwards for list via ..');
37$r = '';
38for ('A' .. 'C') {
39    $r .= $_;
40}
41is ($r, 'ABC', 'Forwards for list via ..');
42
43$r = '';
44for (reverse @array) {
45    $r .= $_;
46}
47is ($r, 'CBA', 'Reverse for array');
48$r = '';
49for (reverse 1,2,3) {
50    $r .= $_;
51}
52is ($r, '321', 'Reverse for list');
53$r = '';
54for (reverse map {$_} @array) {
55    $r .= $_;
56}
57is ($r, 'CBA', 'Reverse for array via map');
58$r = '';
59for (reverse map {$_} 1,2,3) {
60    $r .= $_;
61}
62is ($r, '321', 'Reverse for list via map');
63$r = '';
64for (reverse 1 .. 3) {
65    $r .= $_;
66}
67is ($r, '321', 'Reverse for list via ..');
68$r = '';
69for (reverse 'A' .. 'C') {
70    $r .= $_;
71}
72is ($r, 'CBA', 'Reverse for list via ..');
73
74$r = '';
75for my $i (@array) {
76    $r .= $i;
77}
78is ($r, 'ABC', 'Forwards for array with var');
79$r = '';
80for my $i (1,2,3) {
81    $r .= $i;
82}
83is ($r, '123', 'Forwards for list with var');
84$r = '';
85for my $i (map {$_} @array) {
86    $r .= $i;
87}
88is ($r, 'ABC', 'Forwards for array via map with var');
89$r = '';
90for my $i (map {$_} 1,2,3) {
91    $r .= $i;
92}
93is ($r, '123', 'Forwards for list via map with var');
94$r = '';
95for my $i (1 .. 3) {
96    $r .= $i;
97}
98is ($r, '123', 'Forwards for list via .. with var');
99$r = '';
100for my $i ('A' .. 'C') {
101    $r .= $i;
102}
103is ($r, 'ABC', 'Forwards for list via .. with var');
104
105$r = '';
106for my $i (reverse @array) {
107    $r .= $i;
108}
109is ($r, 'CBA', 'Reverse for array with var');
110$r = '';
111for my $i (reverse 1,2,3) {
112    $r .= $i;
113}
114is ($r, '321', 'Reverse for list with var');
115$r = '';
116for my $i (reverse map {$_} @array) {
117    $r .= $i;
118}
119is ($r, 'CBA', 'Reverse for array via map with var');
120$r = '';
121for my $i (reverse map {$_} 1,2,3) {
122    $r .= $i;
123}
124is ($r, '321', 'Reverse for list via map with var');
125$r = '';
126for my $i (reverse 1 .. 3) {
127    $r .= $i;
128}
129is ($r, '321', 'Reverse for list via .. with var');
130$r = '';
131for my $i (reverse 'A' .. 'C') {
132    $r .= $i;
133}
134is ($r, 'CBA', 'Reverse for list via .. with var');
135
136# For some reason the generate optree is different when $_ is implicit.
137$r = '';
138for $_ (@array) {
139    $r .= $_;
140}
141is ($r, 'ABC', 'Forwards for array with explicit $_');
142$r = '';
143for $_ (1,2,3) {
144    $r .= $_;
145}
146is ($r, '123', 'Forwards for list with explicit $_');
147$r = '';
148for $_ (map {$_} @array) {
149    $r .= $_;
150}
151is ($r, 'ABC', 'Forwards for array via map with explicit $_');
152$r = '';
153for $_ (map {$_} 1,2,3) {
154    $r .= $_;
155}
156is ($r, '123', 'Forwards for list via map with explicit $_');
157$r = '';
158for $_ (1 .. 3) {
159    $r .= $_;
160}
161is ($r, '123', 'Forwards for list via .. with var with explicit $_');
162$r = '';
163for $_ ('A' .. 'C') {
164    $r .= $_;
165}
166is ($r, 'ABC', 'Forwards for list via .. with var with explicit $_');
167
168$r = '';
169for $_ (reverse @array) {
170    $r .= $_;
171}
172is ($r, 'CBA', 'Reverse for array with explicit $_');
173$r = '';
174for $_ (reverse 1,2,3) {
175    $r .= $_;
176}
177is ($r, '321', 'Reverse for list with explicit $_');
178$r = '';
179for $_ (reverse map {$_} @array) {
180    $r .= $_;
181}
182is ($r, 'CBA', 'Reverse for array via map with explicit $_');
183$r = '';
184for $_ (reverse map {$_} 1,2,3) {
185    $r .= $_;
186}
187is ($r, '321', 'Reverse for list via map with explicit $_');
188$r = '';
189for $_ (reverse 1 .. 3) {
190    $r .= $_;
191}
192is ($r, '321', 'Reverse for list via .. with var with explicit $_');
193$r = '';
194for $_ (reverse 'A' .. 'C') {
195    $r .= $_;
196}
197is ($r, 'CBA', 'Reverse for list via .. with var with explicit $_');
198
199# I don't think that my is that different from our in the optree. But test a
200# few:
201$r = '';
202for our $i (reverse @array) {
203    $r .= $i;
204}
205is ($r, 'CBA', 'Reverse for array with our var');
206$r = '';
207for our $i (reverse 1,2,3) {
208    $r .= $i;
209}
210is ($r, '321', 'Reverse for list with our var');
211$r = '';
212for our $i (reverse map {$_} @array) {
213    $r .= $i;
214}
215is ($r, 'CBA', 'Reverse for array via map with our var');
216$r = '';
217for our $i (reverse map {$_} 1,2,3) {
218    $r .= $i;
219}
220is ($r, '321', 'Reverse for list via map with our var');
221$r = '';
222for our $i (reverse 1 .. 3) {
223    $r .= $i;
224}
225is ($r, '321', 'Reverse for list via .. with our var');
226$r = '';
227for our $i (reverse 'A' .. 'C') {
228    $r .= $i;
229}
230is ($r, 'CBA', 'Reverse for list via .. with our var');
231
232
233$r = '';
234for (1, reverse @array) {
235    $r .= $_;
236}
237is ($r, '1CBA', 'Reverse for array with leading value');
238$r = '';
239for ('A', reverse 1,2,3) {
240    $r .= $_;
241}
242is ($r, 'A321', 'Reverse for list with leading value');
243$r = '';
244for (1, reverse map {$_} @array) {
245    $r .= $_;
246}
247is ($r, '1CBA', 'Reverse for array via map with leading value');
248$r = '';
249for ('A', reverse map {$_} 1,2,3) {
250    $r .= $_;
251}
252is ($r, 'A321', 'Reverse for list via map with leading value');
253$r = '';
254for ('A', reverse 1 .. 3) {
255    $r .= $_;
256}
257is ($r, 'A321', 'Reverse for list via .. with leading value');
258$r = '';
259for (1, reverse 'A' .. 'C') {
260    $r .= $_;
261}
262is ($r, '1CBA', 'Reverse for list via .. with leading value');
263
264$r = '';
265for (reverse (@array), 1) {
266    $r .= $_;
267}
268is ($r, 'CBA1', 'Reverse for array with trailing value');
269$r = '';
270for (reverse (1,2,3), 'A') {
271    $r .= $_;
272}
273is ($r, '321A', 'Reverse for list with trailing value');
274$r = '';
275for (reverse (map {$_} @array), 1) {
276    $r .= $_;
277}
278is ($r, 'CBA1', 'Reverse for array via map with trailing value');
279$r = '';
280for (reverse (map {$_} 1,2,3), 'A') {
281    $r .= $_;
282}
283is ($r, '321A', 'Reverse for list via map with trailing value');
284$r = '';
285for (reverse (1 .. 3), 'A') {
286    $r .= $_;
287}
288is ($r, '321A', 'Reverse for list via .. with trailing value');
289$r = '';
290for (reverse ('A' .. 'C'), 1) {
291    $r .= $_;
292}
293is ($r, 'CBA1', 'Reverse for list via .. with trailing value');
294
295
296$r = '';
297for $_ (1, reverse @array) {
298    $r .= $_;
299}
300is ($r, '1CBA', 'Reverse for array with leading value with explicit $_');
301$r = '';
302for $_ ('A', reverse 1,2,3) {
303    $r .= $_;
304}
305is ($r, 'A321', 'Reverse for list with leading value with explicit $_');
306$r = '';
307for $_ (1, reverse map {$_} @array) {
308    $r .= $_;
309}
310is ($r, '1CBA',
311    'Reverse for array via map with leading value with explicit $_');
312$r = '';
313for $_ ('A', reverse map {$_} 1,2,3) {
314    $r .= $_;
315}
316is ($r, 'A321', 'Reverse for list via map with leading value with explicit $_');
317$r = '';
318for $_ ('A', reverse 1 .. 3) {
319    $r .= $_;
320}
321is ($r, 'A321', 'Reverse for list via .. with leading value with explicit $_');
322$r = '';
323for $_ (1, reverse 'A' .. 'C') {
324    $r .= $_;
325}
326is ($r, '1CBA', 'Reverse for list via .. with leading value with explicit $_');
327
328$r = '';
329for $_ (reverse (@array), 1) {
330    $r .= $_;
331}
332is ($r, 'CBA1', 'Reverse for array with trailing value with explicit $_');
333$r = '';
334for $_ (reverse (1,2,3), 'A') {
335    $r .= $_;
336}
337is ($r, '321A', 'Reverse for list with trailing value with explicit $_');
338$r = '';
339for $_ (reverse (map {$_} @array), 1) {
340    $r .= $_;
341}
342is ($r, 'CBA1',
343    'Reverse for array via map with trailing value with explicit $_');
344$r = '';
345for $_ (reverse (map {$_} 1,2,3), 'A') {
346    $r .= $_;
347}
348is ($r, '321A',
349    'Reverse for list via map with trailing value with explicit $_');
350$r = '';
351for $_ (reverse (1 .. 3), 'A') {
352    $r .= $_;
353}
354is ($r, '321A', 'Reverse for list via .. with trailing value with explicit $_');
355$r = '';
356for $_ (reverse ('A' .. 'C'), 1) {
357    $r .= $_;
358}
359is ($r, 'CBA1', 'Reverse for list via .. with trailing value with explicit $_');
360
361$r = '';
362for my $i (1, reverse @array) {
363    $r .= $i;
364}
365is ($r, '1CBA', 'Reverse for array with leading value and var');
366$r = '';
367for my $i ('A', reverse 1,2,3) {
368    $r .= $i;
369}
370is ($r, 'A321', 'Reverse for list with leading value and var');
371$r = '';
372for my $i (1, reverse map {$_} @array) {
373    $r .= $i;
374}
375is ($r, '1CBA', 'Reverse for array via map with leading value and var');
376$r = '';
377for my $i ('A', reverse map {$_} 1,2,3) {
378    $r .= $i;
379}
380is ($r, 'A321', 'Reverse for list via map with leading value and var');
381$r = '';
382for my $i ('A', reverse 1 .. 3) {
383    $r .= $i;
384}
385is ($r, 'A321', 'Reverse for list via .. with leading value and var');
386$r = '';
387for my $i (1, reverse 'A' .. 'C') {
388    $r .= $i;
389}
390is ($r, '1CBA', 'Reverse for list via .. with leading value and var');
391
392$r = '';
393for my $i (reverse (@array), 1) {
394    $r .= $i;
395}
396is ($r, 'CBA1', 'Reverse for array with trailing value and var');
397$r = '';
398for my $i (reverse (1,2,3), 'A') {
399    $r .= $i;
400}
401is ($r, '321A', 'Reverse for list with trailing value and var');
402$r = '';
403for my $i (reverse (map {$_} @array), 1) {
404    $r .= $i;
405}
406is ($r, 'CBA1', 'Reverse for array via map with trailing value and var');
407$r = '';
408for my $i (reverse (map {$_} 1,2,3), 'A') {
409    $r .= $i;
410}
411is ($r, '321A', 'Reverse for list via map with trailing value and var');
412$r = '';
413for my $i (reverse (1 .. 3), 'A') {
414    $r .= $i;
415}
416is ($r, '321A', 'Reverse for list via .. with trailing value and var');
417$r = '';
418for my $i (reverse ('A' .. 'C'), 1) {
419    $r .= $i;
420}
421is ($r, 'CBA1', 'Reverse for list via .. with trailing value and var');
422
423
424$r = '';
425for (reverse 1, @array) {
426    $r .= $_;
427}
428is ($r, 'CBA1', 'Reverse for value and array');
429$r = '';
430for (reverse map {$_} 1, @array) {
431    $r .= $_;
432}
433is ($r, 'CBA1', 'Reverse for value and array via map');
434$r = '';
435for (reverse 1 .. 3, @array) {
436    $r .= $_;
437}
438is ($r, 'CBA321', 'Reverse for .. and array');
439$r = '';
440for (reverse 'X' .. 'Z', @array) {
441    $r .= $_;
442}
443is ($r, 'CBAZYX', 'Reverse for .. and array');
444$r = '';
445for (reverse map {$_} 1 .. 3, @array) {
446    $r .= $_;
447}
448is ($r, 'CBA321', 'Reverse for .. and array via map');
449$r = '';
450for (reverse map {$_} 'X' .. 'Z', @array) {
451    $r .= $_;
452}
453is ($r, 'CBAZYX', 'Reverse for .. and array via map');
454
455$r = '';
456for (reverse (@array, 1)) {
457    $r .= $_;
458}
459is ($r, '1CBA', 'Reverse for array and value');
460$r = '';
461for (reverse (map {$_} @array, 1)) {
462    $r .= $_;
463}
464is ($r, '1CBA', 'Reverse for array and value via map');
465
466$r = '';
467for $_ (reverse 1, @array) {
468    $r .= $_;
469}
470is ($r, 'CBA1', 'Reverse for value and array with explicit $_');
471$r = '';
472for $_ (reverse map {$_} 1, @array) {
473    $r .= $_;
474}
475is ($r, 'CBA1', 'Reverse for value and array via map with explicit $_');
476$r = '';
477for $_ (reverse 1 .. 3, @array) {
478    $r .= $_;
479}
480is ($r, 'CBA321', 'Reverse for .. and array with explicit $_');
481$r = '';
482for $_ (reverse 'X' .. 'Z', @array) {
483    $r .= $_;
484}
485is ($r, 'CBAZYX', 'Reverse for .. and array with explicit $_');
486$r = '';
487for $_ (reverse map {$_} 1 .. 3, @array) {
488    $r .= $_;
489}
490is ($r, 'CBA321', 'Reverse for .. and array via map with explicit $_');
491$r = '';
492for $_ (reverse map {$_} 'X' .. 'Z', @array) {
493    $r .= $_;
494}
495is ($r, 'CBAZYX', 'Reverse for .. and array via map with explicit $_');
496
497$r = '';
498for $_ (reverse (@array, 1)) {
499    $r .= $_;
500}
501is ($r, '1CBA', 'Reverse for array and value with explicit $_');
502$r = '';
503for $_ (reverse (map {$_} @array, 1)) {
504    $r .= $_;
505}
506is ($r, '1CBA', 'Reverse for array and value via map with explicit $_');
507
508
509$r = '';
510for my $i (reverse 1, @array) {
511    $r .= $i;
512}
513is ($r, 'CBA1', 'Reverse for value and array with var');
514$r = '';
515for my $i (reverse map {$_} 1, @array) {
516    $r .= $i;
517}
518is ($r, 'CBA1', 'Reverse for value and array via map with var');
519$r = '';
520for my $i (reverse 1 .. 3, @array) {
521    $r .= $i;
522}
523is ($r, 'CBA321', 'Reverse for .. and array with var');
524$r = '';
525for my $i (reverse 'X' .. 'Z', @array) {
526    $r .= $i;
527}
528is ($r, 'CBAZYX', 'Reverse for .. and array with var');
529$r = '';
530for my $i (reverse map {$_} 1 .. 3, @array) {
531    $r .= $i;
532}
533is ($r, 'CBA321', 'Reverse for .. and array via map with var');
534$r = '';
535for my $i (reverse map {$_} 'X' .. 'Z', @array) {
536    $r .= $i;
537}
538is ($r, 'CBAZYX', 'Reverse for .. and array via map with var');
539
540$r = '';
541for my $i (reverse (@array, 1)) {
542    $r .= $i;
543}
544is ($r, '1CBA', 'Reverse for array and value with var');
545$r = '';
546for my $i (reverse (map {$_} @array, 1)) {
547    $r .= $i;
548}
549is ($r, '1CBA', 'Reverse for array and value via map with var');
550
551is do {17; foreach (1, 2) { 1; } }, '', "RT #1085: what should be output of perl -we 'print do { foreach (1, 2) { 1; } }'";
552
553TODO: {
554    local $TODO = "RT #2166: foreach spuriously autovivifies";
555    my %h;
556    foreach (@h{a, b}) {}
557    is keys(%h), 0, 'RT #2166: foreach spuriously autovivifies';
558}
559
560sub {
561    foreach (@_) {
562        is eval { \$_ }, \undef, 'foreach (@array_containing_undef)'
563    }
564}->(undef);
565
566SKIP: {
567    skip "No XS::APItest under miniperl", 1, if is_miniperl;
568    skip "no XS::APItest", 1 if !eval { require XS::APItest };
569    my @a;
570    sub {
571        XS::APItest::alias_av(\@a, 0, undef);
572        eval { \$_[0] }
573    }->($a[0]);
574    is $@, "", 'vivify_defelem does not croak on &PL_sv_undef elements';
575}
576
577for $x ($y) {
578    $x = 3;
579    ($x, my $z) = (1, $y);
580    is $z, 3, 'list assignment after aliasing via foreach';
581}
582
583for my $x (my $y) {
584    $x = 3;
585    ($x, my $z) = (1, $y);
586    is $z, 3, 'list assignment after aliasing lexical var via foreach';
587}
588
589@_ = ();
590@_ = (1,2,3,scalar do{for(@_){}} + 1, 4, 5, 6);
591is "@_", "1 2 3 1 4 5 6",
592   '[perl #124004] scalar for(@empty_array) stack bug';
593
594# DAPM: while messing with the scope code, I broke some cpan/ code,
595# but surprisingly didn't break any dedicated tests. So test it:
596
597sub fscope {
598    for my $y (1,2) {
599	my $a = $y;
600	return $a;
601    }
602}
603
604is(fscope(), 1, 'return via loop in sub');
605
606# make sure a NULL GvSV is restored at the end of the loop
607
608{
609    local $foo = "boo";
610    {
611        local *foo;
612        for $foo (1,2) {}
613        ok(!defined $foo, "NULL GvSV");
614    }
615}
616
617# make sure storing an int in a NULL GvSV is ok
618
619{
620    local $foo = "boo";
621    {
622        local *foo;
623        for $foo (1..2) {}
624        ok(!defined $foo, "NULL GvSV int iterator");
625    }
626}
627
628# RT #123994 - handle a null GVSV within a loop
629
630{
631    local *foo;
632    local $foo = "outside";
633
634    my $i = 0;
635    for $foo (0..1) {
636        is($foo, $i, "RT #123994 int range $i");
637        *foo = "";
638        $i++;
639    }
640    is($foo, "outside", "RT #123994 int range outside");
641
642    $i = 0;
643    for $foo ('0'..'1') {
644        is($foo, $i, "RT #123994 str range $i");
645        *foo = "";
646        $i++;
647    }
648    is($foo, "outside", "RT #123994 str range outside");
649
650    $i = 0;
651    for $foo (0, 1) {
652        is($foo, $i, "RT #123994 list $i");
653        *foo = "";
654        $i++;
655    }
656    is($foo, "outside", "RT #123994 list outside");
657
658    my @a = (0,1);
659    $i = 0;
660    for $foo (@a) {
661        is($foo, $i, "RT #123994 array $i");
662        *foo = "";
663        $i++;
664    }
665    is($foo, "outside", "RT #123994 array outside");
666}
667
668# RT #133558 'reverse' under AIX was causing loop to terminate
669# immediately, probably due to compiler bug
670
671{
672    my @a = qw(foo);
673    my @b;
674    push @b, $_ for (reverse @a);
675    is "@b", "foo", " RT #133558 reverse array";
676
677    @b = ();
678    push @b, $_ for (reverse 'bar');
679    is "@b", "bar", " RT #133558 reverse list";
680}
681