This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
bump $Time::HiRes::VERSION
[perl5.git] / ext / B / t / optree_varinit.t
1 #!perl
2
3 BEGIN {
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     if (!$Config::Config{useperlio}) {
11         print "1..0 # Skip -- need perlio to walk the optree\n";
12         exit 0;
13     }
14 }
15 use OptreeCheck;
16 use Config;
17 plan tests      => 42;
18
19 pass("OPTIMIZER TESTS - VAR INITIALIZATION");
20
21 checkOptree ( name      => 'sub {my $a}',
22               bcopts    => '-exec',
23               code      => sub {my $a},
24               strip_open_hints => 1,
25               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
26 # 1  <;> nextstate(main 45 optree.t:23) v:>,<,%
27 # 2  <0> padsv[$a:45,46] sM/LVINTRO
28 # 3  <1> leavesub[1 ref] K/REFC,1
29 EOT_EOT
30 # 1  <;> nextstate(main 45 optree.t:23) v:>,<,%
31 # 2  <0> padsv[$a:45,46] sM/LVINTRO
32 # 3  <1> leavesub[1 ref] K/REFC,1
33 EONT_EONT
34
35 checkOptree ( name      => '-exec sub {my $a}',
36               bcopts    => '-exec',
37               code      => sub {my $a},
38               strip_open_hints => 1,
39               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
40 # 1  <;> nextstate(main 49 optree.t:52) v:>,<,%
41 # 2  <0> padsv[$a:49,50] sM/LVINTRO
42 # 3  <1> leavesub[1 ref] K/REFC,1
43 EOT_EOT
44 # 1  <;> nextstate(main 49 optree.t:45) v:>,<,%
45 # 2  <0> padsv[$a:49,50] sM/LVINTRO
46 # 3  <1> leavesub[1 ref] K/REFC,1
47 EONT_EONT
48
49 checkOptree ( name      => 'sub {our $a}',
50               bcopts    => '-exec',
51               code      => sub {our $a},
52               strip_open_hints => 1,
53               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
54 1  <;> nextstate(main 21 optree.t:47) v:>,<,%
55 2  <#> gvsv[*a] s/OURINTR
56 3  <1> leavesub[1 ref] K/REFC,1
57 EOT_EOT
58 # 1  <;> nextstate(main 51 optree.t:56) v:>,<,%
59 # 2  <$> gvsv(*a) s/OURINTR
60 # 3  <1> leavesub[1 ref] K/REFC,1
61 EONT_EONT
62
63 checkOptree ( name      => 'sub {local $a}',
64               bcopts    => '-exec',
65               code      => sub {local $a},
66               strip_open_hints => 1,
67               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
68 1  <;> nextstate(main 23 optree.t:57) v:>,<,%,{
69 2  <#> gvsv[*a] s/LVINTRO
70 3  <1> leavesub[1 ref] K/REFC,1
71 EOT_EOT
72 # 1  <;> nextstate(main 53 optree.t:67) v:>,<,%,{
73 # 2  <$> gvsv(*a) s/LVINTRO
74 # 3  <1> leavesub[1 ref] K/REFC,1
75 EONT_EONT
76
77 checkOptree ( name      => 'my $a',
78               prog      => 'my $a',
79               bcopts    => '-basic',
80               strip_open_hints => 1,
81               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
82 # 4  <@> leave[1 ref] vKP/REFC ->(end)
83 # 1     <0> enter ->2
84 # 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
85 # 3     <0> padsv[$a:1,2] vM/LVINTRO ->4
86 EOT_EOT
87 # 4  <@> leave[1 ref] vKP/REFC ->(end)
88 # 1     <0> enter ->2
89 # 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
90 # 3     <0> padsv[$a:1,2] vM/LVINTRO ->4
91 EONT_EONT
92
93 checkOptree ( name      => 'our $a',
94               prog      => 'our $a',
95               bcopts    => '-basic',
96               strip_open_hints => 1,
97               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
98 3  <@> leave[1 ref] vKP/REFC ->(end)
99 1     <0> enter ->2
100 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
101 -     <1> rv2sv vK/OURINTR,1 ->3
102 -        <#> gv[*a] s ->-
103 EOT_EOT
104 # 3  <@> leave[1 ref] vKP/REFC ->(end)
105 # 1     <0> enter ->2
106 # 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
107 # -     <1> rv2sv vK/OURINTR,1 ->3
108 # -        <$> gv(*a) s ->-
109 EONT_EONT
110
111 checkOptree ( name      => 'local $c',
112               prog      => 'local $c',
113               errs      => ['Name "main::c" used only once: possible typo at -e line 1.'],
114               bcopts    => '-basic',
115               strip_open_hints => 1,
116               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
117 4  <@> leave[1 ref] vKP/REFC ->(end)
118 1     <0> enter ->2
119 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
120 -     <1> ex-rv2sv vKM/LVINTRO,1 ->4
121 3        <#> gvsv[*c] s/LVINTRO ->4
122 EOT_EOT
123 # 4  <@> leave[1 ref] vKP/REFC ->(end)
124 # 1     <0> enter ->2
125 # 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
126 # -     <1> ex-rv2sv vKM/LVINTRO,1 ->4
127 # 3        <$> gvsv(*c) s/LVINTRO ->4
128 EONT_EONT
129
130 pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
131
132 checkOptree ( name      => 'sub {my $a=undef}',
133               code      => sub {my $a=undef},
134               bcopts    => '-basic',
135               strip_open_hints => 1,
136               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
137 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
138 -     <@> lineseq KP ->5
139 1        <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
140 4        <2> sassign sKS/2 ->5
141 2           <0> undef s ->3
142 3           <0> padsv[$a:641,642] sRM*/LVINTRO ->4
143 EOT_EOT
144 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
145 # -     <@> lineseq KP ->5
146 # 1        <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
147 # 4        <2> sassign sKS/2 ->5
148 # 2           <0> undef s ->3
149 # 3           <0> padsv[$a:641,642] sRM*/LVINTRO ->4
150 EONT_EONT
151
152 checkOptree ( name      => 'sub {our $a=undef}',
153               code      => sub {our $a=undef},
154               note      => 'the global must be reset',
155               bcopts    => '-basic',
156               strip_open_hints => 1,
157               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
158 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
159 -     <@> lineseq KP ->5
160 1        <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2
161 4        <2> sassign sKS/2 ->5
162 2           <0> undef s ->3
163 -           <1> ex-rv2sv sKRM*/OURINTR,1 ->4
164 3              <#> gvsv[*a] s/OURINTR ->4
165 EOT_EOT
166 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
167 # -     <@> lineseq KP ->5
168 # 1        <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2
169 # 4        <2> sassign sKS/2 ->5
170 # 2           <0> undef s ->3
171 # -           <1> ex-rv2sv sKRM*/OURINTR,1 ->4
172 # 3              <$> gvsv(*a) s/OURINTR ->4
173 EONT_EONT
174
175 checkOptree ( name      => 'sub {local $a=undef}',
176               code      => sub {local $a=undef},
177               note      => 'local not used enough to bother',
178               bcopts    => '-basic',
179               strip_open_hints => 1,
180               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
181 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
182 -     <@> lineseq KP ->5
183 1        <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2
184 4        <2> sassign sKS/2 ->5
185 2           <0> undef s ->3
186 -           <1> ex-rv2sv sKRM*/LVINTRO,1 ->4
187 3              <#> gvsv[*a] s/LVINTRO ->4
188 EOT_EOT
189 # 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
190 # -     <@> lineseq KP ->5
191 # 1        <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2
192 # 4        <2> sassign sKS/2 ->5
193 # 2           <0> undef s ->3
194 # -           <1> ex-rv2sv sKRM*/LVINTRO,1 ->4
195 # 3              <$> gvsv(*a) s/LVINTRO ->4
196 EONT_EONT
197
198 checkOptree ( name      => 'my $a=undef',
199               prog      => 'my $a=undef',
200               bcopts    => '-basic',
201               strip_open_hints => 1,
202               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
203 6  <@> leave[1 ref] vKP/REFC ->(end)
204 1     <0> enter ->2
205 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
206 5     <2> sassign vKS/2 ->6
207 3        <0> undef s ->4
208 4        <0> padsv[$a:1,2] sRM*/LVINTRO ->5
209 EOT_EOT
210 # 6  <@> leave[1 ref] vKP/REFC ->(end)
211 # 1     <0> enter ->2
212 # 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
213 # 5     <2> sassign vKS/2 ->6
214 # 3        <0> undef s ->4
215 # 4        <0> padsv[$a:1,2] sRM*/LVINTRO ->5
216 EONT_EONT
217
218 checkOptree ( name      => 'our $a=undef',
219               prog      => 'our $a=undef',
220               note      => 'global must be reassigned',
221               bcopts    => '-basic',
222               strip_open_hints => 1,
223               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
224 6  <@> leave[1 ref] vKP/REFC ->(end)
225 1     <0> enter ->2
226 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
227 5     <2> sassign vKS/2 ->6
228 3        <0> undef s ->4
229 -        <1> ex-rv2sv sKRM*/OURINTR,1 ->5
230 4           <#> gvsv[*a] s/OURINTR ->5
231 EOT_EOT
232 # 6  <@> leave[1 ref] vKP/REFC ->(end)
233 # 1     <0> enter ->2
234 # 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
235 # 5     <2> sassign vKS/2 ->6
236 # 3        <0> undef s ->4
237 # -        <1> ex-rv2sv sKRM*/OURINTR,1 ->5
238 # 4           <$> gvsv(*a) s/OURINTR ->5
239 EONT_EONT
240
241 checkOptree ( name      => 'local $c=undef',
242               prog      => 'local $c=undef',
243               errs      => ['Name "main::c" used only once: possible typo at -e line 1.'],
244               note      => 'locals are rare, probably not worth doing',
245               bcopts    => '-basic',
246               strip_open_hints => 1,
247               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
248 6  <@> leave[1 ref] vKP/REFC ->(end)
249 1     <0> enter ->2
250 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
251 5     <2> sassign vKS/2 ->6
252 3        <0> undef s ->4
253 -        <1> ex-rv2sv sKRM*/LVINTRO,1 ->5
254 4           <#> gvsv[*c] s/LVINTRO ->5
255 EOT_EOT
256 # 6  <@> leave[1 ref] vKP/REFC ->(end)
257 # 1     <0> enter ->2
258 # 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
259 # 5     <2> sassign vKS/2 ->6
260 # 3        <0> undef s ->4
261 # -        <1> ex-rv2sv sKRM*/LVINTRO,1 ->5
262 # 4           <$> gvsv(*c) s/LVINTRO ->5
263 EONT_EONT
264
265 checkOptree ( name      => 'sub {my $a=()}',
266               code      => sub {my $a=()},
267               bcopts    => '-exec',
268               strip_open_hints => 1,
269               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
270 1  <;> nextstate(main -439 optree.t:105) v:>,<,%
271 2  <0> stub sP
272 3  <0> padsv[$a:-439,-438] sRM*/LVINTRO
273 4  <2> sassign sKS/2
274 5  <1> leavesub[1 ref] K/REFC,1
275 EOT_EOT
276 # 1  <;> nextstate(main 438 optree_varinit.t:247) v:>,<,%
277 # 2  <0> stub sP
278 # 3  <0> padsv[$a:438,439] sRM*/LVINTRO
279 # 4  <2> sassign sKS/2
280 # 5  <1> leavesub[1 ref] K/REFC,1
281 EONT_EONT
282
283 checkOptree ( name      => 'sub {our $a=()}',
284               code      => sub {our $a=()},
285               #todo     => 'probly not worth doing',
286               bcopts    => '-exec',
287               strip_open_hints => 1,
288               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
289 1  <;> nextstate(main 31 optree.t:177) v:>,<,%,{
290 2  <0> stub sP
291 3  <#> gvsv[*a] s/OURINTR
292 4  <2> sassign sKS/2
293 5  <1> leavesub[1 ref] K/REFC,1
294 EOT_EOT
295 # 1  <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{
296 # 2  <0> stub sP
297 # 3  <$> gvsv(*a) s/OURINTR
298 # 4  <2> sassign sKS/2
299 # 5  <1> leavesub[1 ref] K/REFC,1
300 EONT_EONT
301
302 checkOptree ( name      => 'sub {local $a=()}',
303               code      => sub {local $a=()},
304               #todo     => 'probly not worth doing',
305               bcopts    => '-exec',
306               strip_open_hints => 1,
307               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
308 1  <;> nextstate(main 33 optree.t:190) v:>,<,%,{
309 2  <0> stub sP
310 3  <#> gvsv[*a] s/LVINTRO
311 4  <2> sassign sKS/2
312 5  <1> leavesub[1 ref] K/REFC,1
313 EOT_EOT
314 # 1  <;> nextstate(main 63 optree.t:225) v:>,<,%,{
315 # 2  <0> stub sP
316 # 3  <$> gvsv(*a) s/LVINTRO
317 # 4  <2> sassign sKS/2
318 # 5  <1> leavesub[1 ref] K/REFC,1
319 EONT_EONT
320
321 checkOptree ( name      => 'my $a=()',
322               prog      => 'my $a=()',
323               bcopts    => '-exec',
324               strip_open_hints => 1,
325               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
326 1  <0> enter 
327 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
328 3  <0> stub sP
329 4  <0> padsv[$a:1,2] sRM*/LVINTRO
330 5  <2> sassign vKS/2
331 6  <@> leave[1 ref] vKP/REFC
332 EOT_EOT
333 # 1  <0> enter 
334 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
335 # 3  <0> stub sP
336 # 4  <0> padsv[$a:1,2] sRM*/LVINTRO
337 # 5  <2> sassign vKS/2
338 # 6  <@> leave[1 ref] vKP/REFC
339 EONT_EONT
340
341 checkOptree ( name      => 'our $a=()',
342               prog      => 'our $a=()',
343               #todo     => 'probly not worth doing',
344               bcopts    => '-exec',
345               strip_open_hints => 1,
346               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
347 1  <0> enter 
348 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
349 3  <0> stub sP
350 4  <#> gvsv[*a] s/OURINTR
351 5  <2> sassign vKS/2
352 6  <@> leave[1 ref] vKP/REFC
353 EOT_EOT
354 # 1  <0> enter 
355 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
356 # 3  <0> stub sP
357 # 4  <$> gvsv(*a) s/OURINTR
358 # 5  <2> sassign vKS/2
359 # 6  <@> leave[1 ref] vKP/REFC
360 EONT_EONT
361
362 checkOptree ( name      => 'local $c=()',
363               prog      => 'local $c=()',
364               errs      => ['Name "main::c" used only once: possible typo at -e line 1.'],
365               #todo     => 'probly not worth doing',
366               bcopts    => '-exec',
367               strip_open_hints => 1,
368               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
369 1  <0> enter 
370 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
371 3  <0> stub sP
372 4  <#> gvsv[*c] s/LVINTRO
373 5  <2> sassign vKS/2
374 6  <@> leave[1 ref] vKP/REFC
375 EOT_EOT
376 # 1  <0> enter 
377 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
378 # 3  <0> stub sP
379 # 4  <$> gvsv(*c) s/LVINTRO
380 # 5  <2> sassign vKS/2
381 # 6  <@> leave[1 ref] vKP/REFC
382 EONT_EONT
383
384 checkOptree ( name      => 'my ($a,$b)=()',
385               prog      => 'my ($a,$b)=()',
386               #todo     => 'probly not worth doing',
387               bcopts    => '-exec',
388               strip_open_hints => 1,
389               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
390 # 1  <0> enter 
391 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
392 # 3  <0> pushmark s
393 # 4  <0> padrange[$a:1,2; $b:1,2] RM/LVINTRO,range=2
394 # 5  <2> aassign[t3] vKS
395 # 6  <@> leave[1 ref] vKP/REFC
396 EOT_EOT
397 # 1  <0> enter 
398 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
399 # 3  <0> pushmark s
400 # 4  <0> padrange[$a:1,2; $b:1,2] RM/LVINTRO,range=2
401 # 5  <2> aassign[t3] vKS
402 # 6  <@> leave[1 ref] vKP/REFC
403 EONT_EONT