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