1#!perl 2 3BEGIN { 4 unshift @INC, 't'; 5 require Config; 6 if (($Config::Config{'extensions'} !~ /\bB\b/) ){ 7 print "1..0 # Skip -- Perl configured without B module\n"; 8 exit 0; 9 } 10} 11use OptreeCheck; 12plan tests => 19; 13 14pass("FOR LOOPS"); 15 16checkOptree ( name => 'for (@a)', 17 code => sub {for (@a) {}}, 18 bcopts => '-exec', 19 strip_open_hints => 1, 20 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 211 <;> nextstate(main 424 optree_for.t:14) v:>,<,% 222 <0> pushmark sM 233 <#> gv[*a] s 244 <1> rv2av[t2] sKRM/1 255 <#> gv[*_] s 266 <{> enteriter(next->8 last->b redo->7) KS/DEF 279 <0> iter s 28a <|> and(other->7) K/1 297 <0> stub v 308 <0> unstack s 31 goto 9 32b <2> leaveloop K/2 33c <1> leavesub[1 ref] K/REFC,1 34EOT_EOT 351 <;> nextstate(main 424 optree_for.t:14) v:>,<,% 362 <0> pushmark sM 373 <$> gv(*a) s 384 <1> rv2av[t1] sKRM/1 395 <$> gv(*_) s 406 <{> enteriter(next->8 last->b redo->7) KS/DEF 419 <0> iter s 42a <|> and(other->7) K/1 437 <0> stub v 448 <0> unstack s 45 goto 9 46b <2> leaveloop K/2 47c <1> leavesub[1 ref] K/REFC,1 48EONT_EONT 49 50my @lexical; 51 52checkOptree ( name => 'for (@lexical)', 53 code => sub {for (@lexical) {}}, 54 bcopts => '-exec', 55 strip_open_hints => 1, 56 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 571 <;> nextstate(main 424 optree_for.t:14) v:>,<,% 582 <0> pushmark sM 593 <0> padav[@lexical:FAKE::7] sRM 604 <#> gv[*_] s 615 <{> enteriter(next->7 last->a redo->6) KS/DEF 628 <0> iter s 639 <|> and(other->6) K/1 646 <0> stub v 657 <0> unstack s 66 goto 8 67a <2> leaveloop K/2 68b <1> leavesub[2 refs] K/REFC,1 69EOT_EOT 701 <;> nextstate(main 424 optree_for.t:14) v:>,<,% 712 <0> pushmark sM 723 <0> padav[@lexical:FAKE::2] sRM 734 <$> gv(*_) s 745 <{> enteriter(next->7 last->a redo->6) KS/DEF 758 <0> iter s 769 <|> and(other->6) K/1 776 <0> stub v 787 <0> unstack s 79 goto 8 80a <2> leaveloop K/2 81b <1> leavesub[2 refs] K/REFC,1 82EONT_EONT 83 84checkOptree ( name => 'for $var (@a)', 85 code => sub {for $var (@a) {}}, 86 bcopts => '-exec', 87 strip_open_hints => 1, 88 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 891 <;> nextstate(main 1453 optree_for.t:68) v:{ 902 <0> pushmark sM 913 <#> gv[*a] s 924 <1> rv2av[t3] sKRM/1 935 <#> gv[*var] s 946 <1> rv2gv sKRM/1 957 <{> enteriter(next->9 last->c redo->8) KS 96a <0> iter s 97b <|> and(other->8) K/1 988 <0> stub v 999 <0> unstack s 100 goto a 101c <2> leaveloop KP/2 102d <1> leavesub[1 ref] K/REFC,1 103EOT_EOT 1041 <;> nextstate(main 1453 optree_for.t:67) v:{ 1052 <0> pushmark sM 1063 <$> gv(*a) s 1074 <1> rv2av[t1] sKRM/1 1085 <$> gv(*var) s 1096 <1> rv2gv sKRM/1 1107 <{> enteriter(next->9 last->c redo->8) KS 111a <0> iter s 112b <|> and(other->8) K/1 1138 <0> stub v 1149 <0> unstack s 115 goto a 116c <2> leaveloop KP/2 117d <1> leavesub[1 ref] K/REFC,1 118EONT_EONT 119 120checkOptree ( name => 'for my $var (@a)', 121 code => sub {for my $var (@a) {}}, 122 bcopts => '-exec', 123 strip_open_hints => 1, 124 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1251 <;> nextstate(main 1459 optree_for.t:90) v 1262 <0> pushmark sM 1273 <#> gv[*a] s 1284 <1> rv2av[t3] sKRM/1 1295 <{> enteriter(next->7 last->a redo->6)[$var:1460,1463] KS/LVINTRO 1308 <0> iter s 1319 <|> and(other->6) K/1 1326 <0> stub v 1337 <0> unstack s 134 goto 8 135a <2> leaveloop K/2 136b <1> leavesub[1 ref] K/REFC,1 137EOT_EOT 1381 <;> nextstate(main 424 optree_for.t:14) v:>,<,% 1392 <0> pushmark sM 1403 <$> gv(*a) s 1414 <1> rv2av[t2] sKRM/1 1425 <{> enteriter(next->7 last->a redo->6)[$var:1460,1463] KS/LVINTRO 1438 <0> iter s 1449 <|> and(other->6) K/1 1456 <0> stub v 1467 <0> unstack s 147 goto 8 148a <2> leaveloop K/2 149b <1> leavesub[1 ref] K/REFC,1 150EONT_EONT 151 152checkOptree ( name => 'for our $var (@a)', 153 code => sub {for our $var (@a) {}}, 154 bcopts => '-exec', 155 strip_open_hints => 1, 156 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1571 <;> nextstate(main 1466 optree_for.t:100) v 1582 <0> pushmark sM 1593 <#> gv[*a] s 1604 <1> rv2av[t4] sKRM/1 1615 <#> gv[*var] s 1626 <1> rv2gv sK/FAKE,1 1637 <{> enteriter(next->9 last->c redo->8) KS/OURINTR 164a <0> iter s 165b <|> and(other->8) K/1 1668 <0> stub v 1679 <0> unstack s 168 goto a 169c <2> leaveloop K/2 170d <1> leavesub[1 ref] K/REFC,1 171EOT_EOT 1721 <;> nextstate(main 424 optree_for.t:111) v:>,<,% 1732 <0> pushmark sM 1743 <$> gv(*a) s 1754 <1> rv2av[t2] sKRM/1 1765 <$> gv(*var) s 1776 <1> rv2gv sK/FAKE,1 1787 <{> enteriter(next->9 last->c redo->8) KS/OURINTR 179a <0> iter s 180b <|> and(other->8) K/1 1818 <0> stub v 1829 <0> unstack s 183 goto a 184c <2> leaveloop K/2 185d <1> leavesub[1 ref] K/REFC,1 186EONT_EONT 187 188checkOptree ( name => 'for my ($var) (@a)', 189 code => sub {for my ($var) (@a) {}}, 190 bcopts => '-exec', 191 strip_open_hints => 1, 192 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 1931 <;> nextstate(main 1466 optree_for.t:100) v 1942 <0> pushmark sM 1953 <#> gv[*a] s 1964 <1> rv2av[t3] sKRM/1 1975 <{> enteriter(next->7 last->a redo->6)[$var:1474,1477] KPS/LVINTRO 1988 <0> iter s 1999 <|> and(other->6) K/1 2006 <0> stub v 2017 <0> unstack s 202 goto 8 203a <2> leaveloop K/2 204b <1> leavesub[1 ref] K/REFC,1 205EOT_EOT 2061 <;> nextstate(main 424 optree_for.t:111) v:>,<,% 2072 <0> pushmark sM 2083 <$> gv(*a) s 2094 <1> rv2av[t2] sKRM/1 2105 <{> enteriter(next->7 last->a redo->6)[$var:1474,1477] KPS/LVINTRO 2118 <0> iter s 2129 <|> and(other->6) K/1 2136 <0> stub v 2147 <0> unstack s 215 goto 8 216a <2> leaveloop K/2 217b <1> leavesub[1 ref] K/REFC,1 218EONT_EONT 219 220checkOptree ( name => 'for my ($var) (@lexical)', 221 code => sub {for my ($var) (@lexical) {}}, 222 bcopts => '-exec', 223 strip_open_hints => 1, 224 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2251 <;> nextstate(main 1466 optree_for.t:100) v 2262 <0> pushmark sM 2273 <0> padav[@lexical:FAKE::7] sRM 2284 <{> enteriter(next->6 last->9 redo->5)[$var:1481,1484] KPS/LVINTRO 2297 <0> iter s 2308 <|> and(other->5) K/1 2315 <0> stub v 2326 <0> unstack s 233 goto 7 2349 <2> leaveloop K/2 235a <1> leavesub[2 refs] K/REFC,1 236EOT_EOT 2371 <;> nextstate(main 424 optree_for.t:111) v:>,<,% 2382 <0> pushmark sM 2393 <0> padav[@lexical:FAKE::2] sRM 2404 <{> enteriter(next->6 last->9 redo->5)[$var:1481,1484] KPS/LVINTRO 2417 <0> iter s 2428 <|> and(other->5) K/1 2435 <0> stub v 2446 <0> unstack s 245 goto 7 2469 <2> leaveloop K/2 247a <1> leavesub[2 refs] K/REFC,1 248EONT_EONT 249 250checkOptree ( name => 'for my ($key, $value) (%h)', 251 code => sub {for my ($key, $value) (%h) {}}, 252 bcopts => '-exec', 253 strip_open_hints => 1, 254 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2551 <;> nextstate(main 1466 optree_for.t:100) v 2562 <0> pushmark sM 2573 <#> gv[*h] s 2584 <1> rv2hv[t4] lKM 2595 <{> enteriter(next->7 last->a redo->6)[$key:1488,1491; $value:1488,1491] KP/LVINTRO 2608 <0> iter s 2619 <|> and(other->6) K/1 2626 <0> stub v 2637 <0> unstack s 264 goto 8 265a <2> leaveloop K/2 266b <1> leavesub[1 ref] K/REFC,1 267EOT_EOT 2681 <;> nextstate(main 424 optree_for.t:111) v:>,<,% 2692 <0> pushmark sM 2703 <$> gv(*h) s 2714 <1> rv2hv[t3] lKM 2725 <{> enteriter(next->7 last->a redo->6)[$key:1488,1491; $value:1488,1491] KP/LVINTRO 2738 <0> iter s 2749 <|> and(other->6) K/1 2756 <0> stub v 2767 <0> unstack s 277 goto 8 278a <2> leaveloop K/2 279b <1> leavesub[1 ref] K/REFC,1 280EONT_EONT 281 282checkOptree ( name => 'for my ($foo, $bar, $baz) (@a)', 283 code => sub {for my ($foo, $bar, $baz) (@a) {}}, 284 bcopts => '-exec', 285 strip_open_hints => 1, 286 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT'); 2871 <;> nextstate(main 1466 optree_for.t:100) v 2882 <0> pushmark sM 2893 <#> gv[*a] s 2904 <1> rv2av[t5] sKRM/1 2915 <{> enteriter(next->7 last->a redo->6)[$foo:1495,1498; $bar:1495,1498; $baz:1495,1498] KPS/LVINTRO 2928 <0> iter s 2939 <|> and(other->6) K/1 2946 <0> stub v 2957 <0> unstack s 296 goto 8 297a <2> leaveloop K/2 298b <1> leavesub[1 ref] K/REFC,1 299EOT_EOT 3001 <;> nextstate(main 424 optree_for.t:111) v:>,<,% 3012 <0> pushmark sM 3023 <$> gv(*a) s 3034 <1> rv2av[t4] sKRM/1 3045 <{> enteriter(next->7 last->a redo->6)[$foo:1495,1498; $bar:1495,1498; $baz:1495,1498] KPS/LVINTRO 3058 <0> iter s 3069 <|> and(other->6) K/1 3076 <0> stub v 3087 <0> unstack s 309 goto 8 310a <2> leaveloop K/2 311b <1> leavesub[1 ref] K/REFC,1 312EONT_EONT 313