6 @INC = ('.', '../lib', '../ext/B/t');
12 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
13 print "1..0 # Skip -- Perl configured without B module\n";
16 # require 'test.pl'; # now done by OptreeCheck
23 skip "no perlio in this build", 11 unless $Config::Config{useperlio};
25 pass("SORT OPTIMIZATION");
29 if (((caller 0)[10]||{})->{open}) {
30 @open_todo = (skip => "\$^OPEN is set");
35 checkOptree ( name => 'sub {sort @a}',
36 code => sub {sort @a},
39 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
40 # 1 <;> nextstate(main 424 optree_sort.t:14) v
43 # 4 <1> rv2av[t2] lK/1
45 # 6 <1> leavesub[1 ref] K/REFC,1
47 # 1 <;> nextstate(main 424 optree_sort.t:14) v
50 # 4 <1> rv2av[t1] lK/1
52 # 6 <1> leavesub[1 ref] K/REFC,1
55 checkOptree ( name => 'sort @a',
57 errs => [ 'Useless use of sort in void context at -e line 1.',
58 'Name "main::a" used only once: possible typo at -e line 1.',
62 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
64 2 <;> nextstate(main 1 -e:1) v:{
69 7 <@> leave[1 ref] vKP/REFC
72 # 2 <;> nextstate(main 1 -e:1) v:{
75 # 5 <1> rv2av[t1] lK/1
77 # 7 <@> leave[1 ref] vKP/REFC
80 checkOptree ( name => 'sub {@a = sort @a}',
81 code => sub {@a = sort @a},
84 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
85 1 <;> nextstate(main -438 optree.t:244) v
93 9 <1> rv2av[t2] lKRM*/1
94 a <2> aassign[t5] KS/COMMON
95 b <1> leavesub[1 ref] K/REFC,1
97 # 1 <;> nextstate(main 65 optree.t:311) v
101 # 5 <1> rv2av[t2] lK/1
105 # 9 <1> rv2av[t1] lKRM*/1
106 # a <2> aassign[t3] KS/COMMON
107 # b <1> leavesub[1 ref] K/REFC,1
110 checkOptree ( name => '@a = sort @a',
111 prog => '@a = sort @a',
114 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
116 2 <;> nextstate(main 1 -e:1) v:{
120 6 <1> rv2av[t4] lKRM*/1
121 7 <@> sort lK/INPLACE
122 8 <@> leave[1 ref] vKP/REFC
125 # 2 <;> nextstate(main 1 -e:1) v:{
129 # 6 <1> rv2av[t2] lKRM*/1
130 # 7 <@> sort lK/INPLACE
131 # 8 <@> leave[1 ref] vKP/REFC
134 checkOptree ( name => 'sub {@a = sort @a; reverse @a}',
135 code => sub {@a = sort @a; reverse @a},
138 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
139 1 <;> nextstate(main -438 optree.t:286) v
143 5 <1> rv2av[t4] lKRM*/1
144 6 <@> sort lK/INPLACE
145 7 <;> nextstate(main -438 optree.t:288) v
149 b <@> reverse[t8] K/1
150 c <1> leavesub[1 ref] K/REFC,1
152 # 1 <;> nextstate(main 66 optree.t:345) v
156 # 5 <1> rv2av[t2] lKRM*/1
157 # 6 <@> sort lK/INPLACE
158 # 7 <;> nextstate(main 66 optree.t:346) v
161 # a <1> rv2av[t4] lK/1
162 # b <@> reverse[t5] K/1
163 # c <1> leavesub[1 ref] K/REFC,1
166 checkOptree ( name => '@a = sort @a; reverse @a',
167 prog => '@a = sort @a; reverse @a',
168 errs => ['Useless use of reverse in void context at -e line 1.'],
171 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
173 2 <;> nextstate(main 1 -e:1) v:{
177 6 <1> rv2av[t4] lKRM*/1
178 7 <@> sort lK/INPLACE
179 8 <;> nextstate(main 1 -e:1) v:{
183 c <@> reverse[t8] vK/1
184 d <@> leave[1 ref] vKP/REFC
187 # 2 <;> nextstate(main 1 -e:1) v:{
191 # 6 <1> rv2av[t2] lKRM*/1
192 # 7 <@> sort lK/INPLACE
193 # 8 <;> nextstate(main 1 -e:1) v:{
196 # b <1> rv2av[t4] lK/1
197 # c <@> reverse[t5] vK/1
198 # d <@> leave[1 ref] vKP/REFC
201 checkOptree ( name => 'sub {my @a; @a = sort @a}',
202 code => sub {my @a; @a = sort @a},
205 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
206 1 <;> nextstate(main -437 optree.t:254) v
207 2 <0> padav[@a:-437,-436] vM/LVINTRO
208 3 <;> nextstate(main -436 optree.t:256) v
211 6 <0> padav[@a:-437,-436] l
214 9 <0> padav[@a:-437,-436] lRM*
215 a <2> aassign[t2] KS/COMMON
216 b <1> leavesub[1 ref] K/REFC,1
218 # 1 <;> nextstate(main 427 optree_sort.t:172) v
219 # 2 <0> padav[@a:427,428] vM/LVINTRO
220 # 3 <;> nextstate(main 428 optree_sort.t:173) v
223 # 6 <0> padav[@a:427,428] l
226 # 9 <0> padav[@a:427,428] lRM*
227 # a <2> aassign[t2] KS/COMMON
228 # b <1> leavesub[1 ref] K/REFC,1
231 checkOptree ( name => 'my @a; @a = sort @a',
232 prog => 'my @a; @a = sort @a',
235 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
237 2 <;> nextstate(main 1 -e:1) v:{
238 3 <0> padav[@a:1,2] vM/LVINTRO
239 4 <;> nextstate(main 2 -e:1) v:{
242 7 <0> padav[@a:1,2] lRM*
243 8 <@> sort lK/INPLACE
244 9 <@> leave[1 ref] vKP/REFC
247 # 2 <;> nextstate(main 1 -e:1) v:{
248 # 3 <0> padav[@a:1,2] vM/LVINTRO
249 # 4 <;> nextstate(main 2 -e:1) v:{
252 # 7 <0> padav[@a:1,2] lRM*
253 # 8 <@> sort lK/INPLACE
254 # 9 <@> leave[1 ref] vKP/REFC
257 checkOptree ( name => 'sub {my @a; @a = sort @a; push @a, 1}',
258 code => sub {my @a; @a = sort @a; push @a, 1},
262 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
263 1 <;> nextstate(main -437 optree.t:325) v
264 2 <0> padav[@a:-437,-436] vM/LVINTRO
265 3 <;> nextstate(main -436 optree.t:325) v
268 6 <0> padav[@a:-437,-436] lRM*
269 7 <@> sort lK/INPLACE
270 8 <;> nextstate(main -436 optree.t:325) v:{
272 a <0> padav[@a:-437,-436] lRM
275 d <1> leavesub[1 ref] K/REFC,1
277 # 1 <;> nextstate(main 429 optree_sort.t:219) v
278 # 2 <0> padav[@a:429,430] vM/LVINTRO
279 # 3 <;> nextstate(main 430 optree_sort.t:220) v
282 # 6 <0> padav[@a:429,430] lRM*
283 # 7 <@> sort lK/INPLACE
284 # 8 <;> nextstate(main 430 optree_sort.t:220) v:{
286 # a <0> padav[@a:429,430] lRM
287 # b <$> const(IV 1) s
288 # c <@> push[t3] sK/2
289 # d <1> leavesub[1 ref] K/REFC,1
292 checkOptree ( name => 'sub {my @a; @a = sort @a; 1}',
293 code => sub {my @a; @a = sort @a; 1},
297 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
298 1 <;> nextstate(main -437 optree.t:325) v
299 2 <0> padav[@a:-437,-436] vM/LVINTRO
300 3 <;> nextstate(main -436 optree.t:325) v
303 6 <0> padav[@a:-437,-436] lRM*
304 7 <@> sort lK/INPLACE
305 8 <;> nextstate(main -436 optree.t:346) v:{
307 a <1> leavesub[1 ref] K/REFC,1
309 # 1 <;> nextstate(main 431 optree_sort.t:250) v
310 # 2 <0> padav[@a:431,432] vM/LVINTRO
311 # 3 <;> nextstate(main 432 optree_sort.t:251) v
314 # 6 <0> padav[@a:431,432] lRM*
315 # 7 <@> sort lK/INPLACE
316 # 8 <;> nextstate(main 432 optree_sort.t:251) v:{
317 # 9 <$> const(IV 1) s
318 # a <1> leavesub[1 ref] K/REFC,1