This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
regcomp.c: Use symbolic constant instead of number
[perl5.git] / ext / B / t / optree_varinit.t
CommitLineData
724aa791
JC
1#!perl
2
3BEGIN {
74517a3a 4 unshift @INC, 't';
9cd8f857
NC
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 }
27e11f68
NC
10 if (!$Config::Config{useperlio}) {
11 print "1..0 # Skip -- need perlio to walk the optree\n";
12 exit 0;
13 }
724aa791
JC
14}
15use OptreeCheck;
2ce64696 16use Config;
3857d07c 17plan tests => 42;
2ce64696 18
724aa791
JC
19pass("OPTIMIZER TESTS - VAR INITIALIZATION");
20
21checkOptree ( name => 'sub {my $a}',
22 bcopts => '-exec',
23 code => sub {my $a},
be2b1c74 24 strip_open_hints => 1,
724aa791 25 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
be2b1c74 26# 1 <;> nextstate(main 45 optree.t:23) v:>,<,%
724aa791
JC
27# 2 <0> padsv[$a:45,46] M/LVINTRO
28# 3 <1> leavesub[1 ref] K/REFC,1
29EOT_EOT
be2b1c74 30# 1 <;> nextstate(main 45 optree.t:23) v:>,<,%
724aa791
JC
31# 2 <0> padsv[$a:45,46] M/LVINTRO
32# 3 <1> leavesub[1 ref] K/REFC,1
33EONT_EONT
34
35checkOptree ( name => '-exec sub {my $a}',
36 bcopts => '-exec',
37 code => sub {my $a},
be2b1c74 38 strip_open_hints => 1,
724aa791 39 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
be2b1c74 40# 1 <;> nextstate(main 49 optree.t:52) v:>,<,%
724aa791
JC
41# 2 <0> padsv[$a:49,50] M/LVINTRO
42# 3 <1> leavesub[1 ref] K/REFC,1
43EOT_EOT
be2b1c74 44# 1 <;> nextstate(main 49 optree.t:45) v:>,<,%
724aa791
JC
45# 2 <0> padsv[$a:49,50] M/LVINTRO
46# 3 <1> leavesub[1 ref] K/REFC,1
47EONT_EONT
48
49checkOptree ( name => 'sub {our $a}',
50 bcopts => '-exec',
51 code => sub {our $a},
be2b1c74 52 strip_open_hints => 1,
724aa791 53 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
be2b1c74 541 <;> nextstate(main 21 optree.t:47) v:>,<,%
724aa791
JC
552 <#> gvsv[*a] s/OURINTR
563 <1> leavesub[1 ref] K/REFC,1
57EOT_EOT
be2b1c74 58# 1 <;> nextstate(main 51 optree.t:56) v:>,<,%
724aa791
JC
59# 2 <$> gvsv(*a) s/OURINTR
60# 3 <1> leavesub[1 ref] K/REFC,1
61EONT_EONT
62
63checkOptree ( name => 'sub {local $a}',
64 bcopts => '-exec',
65 code => sub {local $a},
be2b1c74 66 strip_open_hints => 1,
724aa791 67 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
be2b1c74 681 <;> nextstate(main 23 optree.t:57) v:>,<,%,{
724aa791
JC
692 <#> gvsv[*a] s/LVINTRO
703 <1> leavesub[1 ref] K/REFC,1
71EOT_EOT
be2b1c74 72# 1 <;> nextstate(main 53 optree.t:67) v:>,<,%,{
724aa791
JC
73# 2 <$> gvsv(*a) s/LVINTRO
74# 3 <1> leavesub[1 ref] K/REFC,1
75EONT_EONT
76
77checkOptree ( name => 'my $a',
78 prog => 'my $a',
79 bcopts => '-basic',
be2b1c74 80 strip_open_hints => 1,
724aa791
JC
81 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
82# 4 <@> leave[1 ref] vKP/REFC ->(end)
83# 1 <0> enter ->2
be2b1c74 84# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
85# 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
86EOT_EOT
87# 4 <@> leave[1 ref] vKP/REFC ->(end)
88# 1 <0> enter ->2
be2b1c74 89# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
90# 3 <0> padsv[$a:1,2] vM/LVINTRO ->4
91EONT_EONT
92
93checkOptree ( name => 'our $a',
94 prog => 'our $a',
95 bcopts => '-basic',
be2b1c74 96 strip_open_hints => 1,
724aa791
JC
97 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
984 <@> leave[1 ref] vKP/REFC ->(end)
991 <0> enter ->2
be2b1c74 1002 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
101- <1> ex-rv2sv vK/17 ->4
1023 <#> gvsv[*a] s/OURINTR ->4
103EOT_EOT
104# 4 <@> leave[1 ref] vKP/REFC ->(end)
105# 1 <0> enter ->2
be2b1c74 106# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
107# - <1> ex-rv2sv vK/17 ->4
108# 3 <$> gvsv(*a) s/OURINTR ->4
109EONT_EONT
110
ea238638
FC
111checkOptree ( name => 'local $c',
112 prog => 'local $c',
113 errs => ['Name "main::c" used only once: possible typo at -e line 1.'],
724aa791 114 bcopts => '-basic',
be2b1c74 115 strip_open_hints => 1,
724aa791
JC
116 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1174 <@> leave[1 ref] vKP/REFC ->(end)
1181 <0> enter ->2
be2b1c74 1192 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791 120- <1> ex-rv2sv vKM/129 ->4
ea238638 1213 <#> gvsv[*c] s/LVINTRO ->4
724aa791
JC
122EOT_EOT
123# 4 <@> leave[1 ref] vKP/REFC ->(end)
124# 1 <0> enter ->2
be2b1c74 125# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791 126# - <1> ex-rv2sv vKM/129 ->4
ea238638 127# 3 <$> gvsv(*c) s/LVINTRO ->4
724aa791
JC
128EONT_EONT
129
130pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
131
132checkOptree ( name => 'sub {my $a=undef}',
133 code => sub {my $a=undef},
134 bcopts => '-basic',
be2b1c74 135 strip_open_hints => 1,
724aa791 136 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
0b599ae5
RGS
1375 <1> leavesub[1 ref] K/REFC,1 ->(end)
138- <@> lineseq KP ->5
be2b1c74 1391 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
0b599ae5
RGS
1404 <2> sassign sKS/2 ->5
1412 <0> undef s ->3
1423 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
724aa791 143EOT_EOT
0b599ae5
RGS
144# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
145# - <@> lineseq KP ->5
be2b1c74 146# 1 <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
0b599ae5
RGS
147# 4 <2> sassign sKS/2 ->5
148# 2 <0> undef s ->3
149# 3 <0> padsv[$a:641,642] sRM*/LVINTRO ->4
724aa791
JC
150EONT_EONT
151
152checkOptree ( name => 'sub {our $a=undef}',
153 code => sub {our $a=undef},
154 note => 'the global must be reset',
155 bcopts => '-basic',
be2b1c74 156 strip_open_hints => 1,
724aa791
JC
157 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1585 <1> leavesub[1 ref] K/REFC,1 ->(end)
159- <@> lineseq KP ->5
be2b1c74 1601 <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2
724aa791
JC
1614 <2> sassign sKS/2 ->5
1622 <0> undef s ->3
163- <1> ex-rv2sv sKRM*/17 ->4
1643 <#> gvsv[*a] s/OURINTR ->4
165EOT_EOT
166# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
167# - <@> lineseq KP ->5
be2b1c74 168# 1 <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2
724aa791
JC
169# 4 <2> sassign sKS/2 ->5
170# 2 <0> undef s ->3
171# - <1> ex-rv2sv sKRM*/17 ->4
172# 3 <$> gvsv(*a) s/OURINTR ->4
173EONT_EONT
174
175checkOptree ( name => 'sub {local $a=undef}',
176 code => sub {local $a=undef},
177 note => 'local not used enough to bother',
178 bcopts => '-basic',
be2b1c74 179 strip_open_hints => 1,
724aa791
JC
180 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1815 <1> leavesub[1 ref] K/REFC,1 ->(end)
182- <@> lineseq KP ->5
be2b1c74 1831 <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2
724aa791
JC
1844 <2> sassign sKS/2 ->5
1852 <0> undef s ->3
186- <1> ex-rv2sv sKRM*/129 ->4
1873 <#> gvsv[*a] s/LVINTRO ->4
188EOT_EOT
189# 5 <1> leavesub[1 ref] K/REFC,1 ->(end)
190# - <@> lineseq KP ->5
be2b1c74 191# 1 <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2
724aa791
JC
192# 4 <2> sassign sKS/2 ->5
193# 2 <0> undef s ->3
194# - <1> ex-rv2sv sKRM*/129 ->4
195# 3 <$> gvsv(*a) s/LVINTRO ->4
196EONT_EONT
197
198checkOptree ( name => 'my $a=undef',
199 prog => 'my $a=undef',
200 bcopts => '-basic',
be2b1c74 201 strip_open_hints => 1,
724aa791 202 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
0b599ae5 2036 <@> leave[1 ref] vKP/REFC ->(end)
724aa791 2041 <0> enter ->2
be2b1c74 2052 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
0b599ae5
RGS
2065 <2> sassign vKS/2 ->6
2073 <0> undef s ->4
2084 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
724aa791 209EOT_EOT
0b599ae5 210# 6 <@> leave[1 ref] vKP/REFC ->(end)
724aa791 211# 1 <0> enter ->2
be2b1c74 212# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
0b599ae5
RGS
213# 5 <2> sassign vKS/2 ->6
214# 3 <0> undef s ->4
215# 4 <0> padsv[$a:1,2] sRM*/LVINTRO ->5
724aa791
JC
216EONT_EONT
217
218checkOptree ( name => 'our $a=undef',
219 prog => 'our $a=undef',
220 note => 'global must be reassigned',
221 bcopts => '-basic',
be2b1c74 222 strip_open_hints => 1,
724aa791
JC
223 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2246 <@> leave[1 ref] vKP/REFC ->(end)
2251 <0> enter ->2
be2b1c74 2262 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
2275 <2> sassign vKS/2 ->6
2283 <0> undef s ->4
229- <1> ex-rv2sv sKRM*/17 ->5
2304 <#> gvsv[*a] s/OURINTR ->5
231EOT_EOT
232# 6 <@> leave[1 ref] vKP/REFC ->(end)
233# 1 <0> enter ->2
be2b1c74 234# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
235# 5 <2> sassign vKS/2 ->6
236# 3 <0> undef s ->4
237# - <1> ex-rv2sv sKRM*/17 ->5
238# 4 <$> gvsv(*a) s/OURINTR ->5
239EONT_EONT
240
ea238638
FC
241checkOptree ( name => 'local $c=undef',
242 prog => 'local $c=undef',
243 errs => ['Name "main::c" used only once: possible typo at -e line 1.'],
b7b1e41b 244 note => 'locals are rare, probably not worth doing',
724aa791 245 bcopts => '-basic',
be2b1c74 246 strip_open_hints => 1,
724aa791
JC
247 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2486 <@> leave[1 ref] vKP/REFC ->(end)
2491 <0> enter ->2
be2b1c74 2502 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
2515 <2> sassign vKS/2 ->6
2523 <0> undef s ->4
253- <1> ex-rv2sv sKRM*/129 ->5
ea238638 2544 <#> gvsv[*c] s/LVINTRO ->5
724aa791
JC
255EOT_EOT
256# 6 <@> leave[1 ref] vKP/REFC ->(end)
257# 1 <0> enter ->2
be2b1c74 258# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
724aa791
JC
259# 5 <2> sassign vKS/2 ->6
260# 3 <0> undef s ->4
261# - <1> ex-rv2sv sKRM*/129 ->5
ea238638 262# 4 <$> gvsv(*c) s/LVINTRO ->5
724aa791
JC
263EONT_EONT
264
265checkOptree ( name => 'sub {my $a=()}',
266 code => sub {my $a=()},
724aa791 267 bcopts => '-exec',
be2b1c74 268 strip_open_hints => 1,
724aa791 269 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
be2b1c74 2701 <;> nextstate(main -439 optree.t:105) v:>,<,%
724aa791
JC
2712 <0> stub sP
2723 <0> padsv[$a:-439,-438] sRM*/LVINTRO
2734 <2> sassign sKS/2
2745 <1> leavesub[1 ref] K/REFC,1
275EOT_EOT
be2b1c74 276# 1 <;> nextstate(main 438 optree_varinit.t:247) v:>,<,%
724aa791
JC
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
281EONT_EONT
282
283checkOptree ( name => 'sub {our $a=()}',
284 code => sub {our $a=()},
285 #todo => 'probly not worth doing',
286 bcopts => '-exec',
be2b1c74 287 strip_open_hints => 1,
724aa791 288 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
be2b1c74 2891 <;> nextstate(main 31 optree.t:177) v:>,<,%,{
724aa791
JC
2902 <0> stub sP
2913 <#> gvsv[*a] s/OURINTR
2924 <2> sassign sKS/2
2935 <1> leavesub[1 ref] K/REFC,1
294EOT_EOT
be2b1c74 295# 1 <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{
724aa791
JC
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
300EONT_EONT
301
302checkOptree ( name => 'sub {local $a=()}',
303 code => sub {local $a=()},
304 #todo => 'probly not worth doing',
305 bcopts => '-exec',
be2b1c74 306 strip_open_hints => 1,
724aa791 307 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
be2b1c74 3081 <;> nextstate(main 33 optree.t:190) v:>,<,%,{
724aa791
JC
3092 <0> stub sP
3103 <#> gvsv[*a] s/LVINTRO
3114 <2> sassign sKS/2
3125 <1> leavesub[1 ref] K/REFC,1
313EOT_EOT
be2b1c74 314# 1 <;> nextstate(main 63 optree.t:225) v:>,<,%,{
724aa791
JC
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
319EONT_EONT
320
321checkOptree ( name => 'my $a=()',
322 prog => 'my $a=()',
724aa791 323 bcopts => '-exec',
be2b1c74 324 strip_open_hints => 1,
724aa791
JC
325 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3261 <0> enter
be2b1c74 3272 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791
JC
3283 <0> stub sP
3294 <0> padsv[$a:1,2] sRM*/LVINTRO
3305 <2> sassign vKS/2
3316 <@> leave[1 ref] vKP/REFC
332EOT_EOT
333# 1 <0> enter
be2b1c74 334# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791
JC
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
339EONT_EONT
340
341checkOptree ( name => 'our $a=()',
342 prog => 'our $a=()',
343 #todo => 'probly not worth doing',
344 bcopts => '-exec',
be2b1c74 345 strip_open_hints => 1,
724aa791
JC
346 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3471 <0> enter
be2b1c74 3482 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791
JC
3493 <0> stub sP
3504 <#> gvsv[*a] s/OURINTR
3515 <2> sassign vKS/2
3526 <@> leave[1 ref] vKP/REFC
353EOT_EOT
354# 1 <0> enter
be2b1c74 355# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791
JC
356# 3 <0> stub sP
357# 4 <$> gvsv(*a) s/OURINTR
358# 5 <2> sassign vKS/2
359# 6 <@> leave[1 ref] vKP/REFC
360EONT_EONT
361
ea238638
FC
362checkOptree ( name => 'local $c=()',
363 prog => 'local $c=()',
364 errs => ['Name "main::c" used only once: possible typo at -e line 1.'],
724aa791
JC
365 #todo => 'probly not worth doing',
366 bcopts => '-exec',
be2b1c74 367 strip_open_hints => 1,
724aa791
JC
368 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3691 <0> enter
be2b1c74 3702 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791 3713 <0> stub sP
ea238638 3724 <#> gvsv[*c] s/LVINTRO
724aa791
JC
3735 <2> sassign vKS/2
3746 <@> leave[1 ref] vKP/REFC
375EOT_EOT
376# 1 <0> enter
be2b1c74 377# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791 378# 3 <0> stub sP
ea238638 379# 4 <$> gvsv(*c) s/LVINTRO
724aa791
JC
380# 5 <2> sassign vKS/2
381# 6 <@> leave[1 ref] vKP/REFC
382EONT_EONT
383
384checkOptree ( name => 'my ($a,$b)=()',
385 prog => 'my ($a,$b)=()',
386 #todo => 'probly not worth doing',
387 bcopts => '-exec',
be2b1c74 388 strip_open_hints => 1,
724aa791
JC
389 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
390# 1 <0> enter
be2b1c74 391# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791 392# 3 <0> pushmark s
d5524600 393# 4 <0> padrange[$a:1,2; $b:1,2] lRM/LVINTRO,2
a7fd8ef6
DM
394# 5 <2> aassign[t3] vKS
395# 6 <@> leave[1 ref] vKP/REFC
724aa791
JC
396EOT_EOT
397# 1 <0> enter
be2b1c74 398# 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
724aa791 399# 3 <0> pushmark s
d5524600 400# 4 <0> padrange[$a:1,2; $b:1,2] lRM/LVINTRO,2
a7fd8ef6
DM
401# 5 <2> aassign[t3] vKS
402# 6 <@> leave[1 ref] vKP/REFC
724aa791 403EONT_EONT