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