xref: /openbsd/gnu/usr.bin/perl/ext/B/t/optree_varinit.t (revision 17df1aa7)
1#!perl
2
3BEGIN {
4    if ($ENV{PERL_CORE}){
5	chdir('t') if -d 't';
6	@INC = ('.', '../lib', '../ext/B/t');
7    } else {
8	unshift @INC, 't';
9	push @INC, "../../t";
10    }
11    require Config;
12    if (($Config::Config{'extensions'} !~ /\bB\b/) ){
13        print "1..0 # Skip -- Perl configured without B module\n";
14        exit 0;
15    }
16    # require 'test.pl'; # now done by OptreeCheck
17}
18use OptreeCheck;
19use Config;
20plan tests	=> 22;
21SKIP: {
22skip "no perlio in this build", 22 unless $Config::Config{useperlio};
23
24pass("OPTIMIZER TESTS - VAR INITIALIZATION");
25
26checkOptree ( name	=> 'sub {my $a}',
27	      bcopts	=> '-exec',
28	      code	=> sub {my $a},
29	      strip_open_hints => 1,
30	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
31# 1  <;> nextstate(main 45 optree.t:23) v:>,<,%
32# 2  <0> padsv[$a:45,46] M/LVINTRO
33# 3  <1> leavesub[1 ref] K/REFC,1
34EOT_EOT
35# 1  <;> nextstate(main 45 optree.t:23) v:>,<,%
36# 2  <0> padsv[$a:45,46] M/LVINTRO
37# 3  <1> leavesub[1 ref] K/REFC,1
38EONT_EONT
39
40checkOptree ( name	=> '-exec sub {my $a}',
41	      bcopts	=> '-exec',
42	      code	=> sub {my $a},
43	      strip_open_hints => 1,
44	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
45# 1  <;> nextstate(main 49 optree.t:52) v:>,<,%
46# 2  <0> padsv[$a:49,50] M/LVINTRO
47# 3  <1> leavesub[1 ref] K/REFC,1
48EOT_EOT
49# 1  <;> nextstate(main 49 optree.t:45) v:>,<,%
50# 2  <0> padsv[$a:49,50] M/LVINTRO
51# 3  <1> leavesub[1 ref] K/REFC,1
52EONT_EONT
53
54checkOptree ( name	=> 'sub {our $a}',
55	      bcopts	=> '-exec',
56	      code	=> sub {our $a},
57	      strip_open_hints => 1,
58	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
591  <;> nextstate(main 21 optree.t:47) v:>,<,%
602  <#> gvsv[*a] s/OURINTR
613  <1> leavesub[1 ref] K/REFC,1
62EOT_EOT
63# 1  <;> nextstate(main 51 optree.t:56) v:>,<,%
64# 2  <$> gvsv(*a) s/OURINTR
65# 3  <1> leavesub[1 ref] K/REFC,1
66EONT_EONT
67
68checkOptree ( name	=> 'sub {local $a}',
69	      bcopts	=> '-exec',
70	      code	=> sub {local $a},
71	      strip_open_hints => 1,
72	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
731  <;> nextstate(main 23 optree.t:57) v:>,<,%,{
742  <#> gvsv[*a] s/LVINTRO
753  <1> leavesub[1 ref] K/REFC,1
76EOT_EOT
77# 1  <;> nextstate(main 53 optree.t:67) v:>,<,%,{
78# 2  <$> gvsv(*a) s/LVINTRO
79# 3  <1> leavesub[1 ref] K/REFC,1
80EONT_EONT
81
82checkOptree ( name	=> 'my $a',
83	      prog	=> 'my $a',
84	      bcopts	=> '-basic',
85	      strip_open_hints => 1,
86	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
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
91EOT_EOT
92# 4  <@> leave[1 ref] vKP/REFC ->(end)
93# 1     <0> enter ->2
94# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
95# 3     <0> padsv[$a:1,2] vM/LVINTRO ->4
96EONT_EONT
97
98checkOptree ( name	=> 'our $a',
99	      prog	=> 'our $a',
100	      bcopts	=> '-basic',
101	      strip_open_hints => 1,
102	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1034  <@> leave[1 ref] vKP/REFC ->(end)
1041     <0> enter ->2
1052     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
106-     <1> ex-rv2sv vK/17 ->4
1073        <#> gvsv[*a] s/OURINTR ->4
108EOT_EOT
109# 4  <@> leave[1 ref] vKP/REFC ->(end)
110# 1     <0> enter ->2
111# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
112# -     <1> ex-rv2sv vK/17 ->4
113# 3        <$> gvsv(*a) s/OURINTR ->4
114EONT_EONT
115
116checkOptree ( name	=> 'local $a',
117	      prog	=> 'local $a',
118	      errs      => ['Name "main::a" used only once: possible typo at -e line 1.'],
119	      bcopts	=> '-basic',
120	      strip_open_hints => 1,
121	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1224  <@> leave[1 ref] vKP/REFC ->(end)
1231     <0> enter ->2
1242     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
125-     <1> ex-rv2sv vKM/129 ->4
1263        <#> gvsv[*a] s/LVINTRO ->4
127EOT_EOT
128# 4  <@> leave[1 ref] vKP/REFC ->(end)
129# 1     <0> enter ->2
130# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
131# -     <1> ex-rv2sv vKM/129 ->4
132# 3        <$> gvsv(*a) s/LVINTRO ->4
133EONT_EONT
134
135pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
136
137checkOptree ( name	=> 'sub {my $a=undef}',
138	      code	=> sub {my $a=undef},
139	      bcopts	=> '-basic',
140	      strip_open_hints => 1,
141	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1425  <1> leavesub[1 ref] K/REFC,1 ->(end)
143-     <@> lineseq KP ->5
1441        <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
1454        <2> sassign sKS/2 ->5
1462           <0> undef s ->3
1473           <0> padsv[$a:641,642] sRM*/LVINTRO ->4
148EOT_EOT
149# 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
150# -     <@> lineseq KP ->5
151# 1        <;> nextstate(main 641 optree_varinit.t:130) v:>,<,% ->2
152# 4        <2> sassign sKS/2 ->5
153# 2           <0> undef s ->3
154# 3           <0> padsv[$a:641,642] sRM*/LVINTRO ->4
155EONT_EONT
156
157checkOptree ( name	=> 'sub {our $a=undef}',
158	      code	=> sub {our $a=undef},
159	      note	=> 'the global must be reset',
160	      bcopts	=> '-basic',
161	      strip_open_hints => 1,
162	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1635  <1> leavesub[1 ref] K/REFC,1 ->(end)
164-     <@> lineseq KP ->5
1651        <;> nextstate(main 26 optree.t:109) v:>,<,%,{ ->2
1664        <2> sassign sKS/2 ->5
1672           <0> undef s ->3
168-           <1> ex-rv2sv sKRM*/17 ->4
1693              <#> gvsv[*a] s/OURINTR ->4
170EOT_EOT
171# 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
172# -     <@> lineseq KP ->5
173# 1        <;> nextstate(main 446 optree_varinit.t:137) v:>,<,%,{ ->2
174# 4        <2> sassign sKS/2 ->5
175# 2           <0> undef s ->3
176# -           <1> ex-rv2sv sKRM*/17 ->4
177# 3              <$> gvsv(*a) s/OURINTR ->4
178EONT_EONT
179
180checkOptree ( name	=> 'sub {local $a=undef}',
181	      code	=> sub {local $a=undef},
182	      note	=> 'local not used enough to bother',
183	      bcopts	=> '-basic',
184	      strip_open_hints => 1,
185	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1865  <1> leavesub[1 ref] K/REFC,1 ->(end)
187-     <@> lineseq KP ->5
1881        <;> nextstate(main 28 optree.t:122) v:>,<,%,{ ->2
1894        <2> sassign sKS/2 ->5
1902           <0> undef s ->3
191-           <1> ex-rv2sv sKRM*/129 ->4
1923              <#> gvsv[*a] s/LVINTRO ->4
193EOT_EOT
194# 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
195# -     <@> lineseq KP ->5
196# 1        <;> nextstate(main 58 optree.t:141) v:>,<,%,{ ->2
197# 4        <2> sassign sKS/2 ->5
198# 2           <0> undef s ->3
199# -           <1> ex-rv2sv sKRM*/129 ->4
200# 3              <$> gvsv(*a) s/LVINTRO ->4
201EONT_EONT
202
203checkOptree ( name	=> 'my $a=undef',
204	      prog	=> 'my $a=undef',
205	      bcopts	=> '-basic',
206	      strip_open_hints => 1,
207	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2086  <@> leave[1 ref] vKP/REFC ->(end)
2091     <0> enter ->2
2102     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
2115     <2> sassign vKS/2 ->6
2123        <0> undef s ->4
2134        <0> padsv[$a:1,2] sRM*/LVINTRO ->5
214EOT_EOT
215# 6  <@> leave[1 ref] vKP/REFC ->(end)
216# 1     <0> enter ->2
217# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
218# 5     <2> sassign vKS/2 ->6
219# 3        <0> undef s ->4
220# 4        <0> padsv[$a:1,2] sRM*/LVINTRO ->5
221EONT_EONT
222
223checkOptree ( name	=> 'our $a=undef',
224	      prog	=> 'our $a=undef',
225	      note	=> 'global must be reassigned',
226	      bcopts	=> '-basic',
227	      strip_open_hints => 1,
228	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2296  <@> leave[1 ref] vKP/REFC ->(end)
2301     <0> enter ->2
2312     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
2325     <2> sassign vKS/2 ->6
2333        <0> undef s ->4
234-        <1> ex-rv2sv sKRM*/17 ->5
2354           <#> gvsv[*a] s/OURINTR ->5
236EOT_EOT
237# 6  <@> leave[1 ref] vKP/REFC ->(end)
238# 1     <0> enter ->2
239# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
240# 5     <2> sassign vKS/2 ->6
241# 3        <0> undef s ->4
242# -        <1> ex-rv2sv sKRM*/17 ->5
243# 4           <$> gvsv(*a) s/OURINTR ->5
244EONT_EONT
245
246checkOptree ( name	=> 'local $a=undef',
247	      prog	=> 'local $a=undef',
248	      errs      => ['Name "main::a" used only once: possible typo at -e line 1.'],
249	      note	=> 'locals are rare, probly not worth doing',
250	      bcopts	=> '-basic',
251	      strip_open_hints => 1,
252	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2536  <@> leave[1 ref] vKP/REFC ->(end)
2541     <0> enter ->2
2552     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
2565     <2> sassign vKS/2 ->6
2573        <0> undef s ->4
258-        <1> ex-rv2sv sKRM*/129 ->5
2594           <#> gvsv[*a] s/LVINTRO ->5
260EOT_EOT
261# 6  <@> leave[1 ref] vKP/REFC ->(end)
262# 1     <0> enter ->2
263# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
264# 5     <2> sassign vKS/2 ->6
265# 3        <0> undef s ->4
266# -        <1> ex-rv2sv sKRM*/129 ->5
267# 4           <$> gvsv(*a) s/LVINTRO ->5
268EONT_EONT
269
270checkOptree ( name	=> 'sub {my $a=()}',
271	      code	=> sub {my $a=()},
272	      bcopts	=> '-exec',
273	      strip_open_hints => 1,
274	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2751  <;> nextstate(main -439 optree.t:105) v:>,<,%
2762  <0> stub sP
2773  <0> padsv[$a:-439,-438] sRM*/LVINTRO
2784  <2> sassign sKS/2
2795  <1> leavesub[1 ref] K/REFC,1
280EOT_EOT
281# 1  <;> nextstate(main 438 optree_varinit.t:247) v:>,<,%
282# 2  <0> stub sP
283# 3  <0> padsv[$a:438,439] sRM*/LVINTRO
284# 4  <2> sassign sKS/2
285# 5  <1> leavesub[1 ref] K/REFC,1
286EONT_EONT
287
288checkOptree ( name	=> 'sub {our $a=()}',
289	      code	=> sub {our $a=()},
290              #todo	=> 'probly not worth doing',
291	      bcopts	=> '-exec',
292	      strip_open_hints => 1,
293	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2941  <;> nextstate(main 31 optree.t:177) v:>,<,%,{
2952  <0> stub sP
2963  <#> gvsv[*a] s/OURINTR
2974  <2> sassign sKS/2
2985  <1> leavesub[1 ref] K/REFC,1
299EOT_EOT
300# 1  <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{
301# 2  <0> stub sP
302# 3  <$> gvsv(*a) s/OURINTR
303# 4  <2> sassign sKS/2
304# 5  <1> leavesub[1 ref] K/REFC,1
305EONT_EONT
306
307checkOptree ( name	=> 'sub {local $a=()}',
308	      code	=> sub {local $a=()},
309              #todo	=> 'probly not worth doing',
310	      bcopts	=> '-exec',
311	      strip_open_hints => 1,
312	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3131  <;> nextstate(main 33 optree.t:190) v:>,<,%,{
3142  <0> stub sP
3153  <#> gvsv[*a] s/LVINTRO
3164  <2> sassign sKS/2
3175  <1> leavesub[1 ref] K/REFC,1
318EOT_EOT
319# 1  <;> nextstate(main 63 optree.t:225) v:>,<,%,{
320# 2  <0> stub sP
321# 3  <$> gvsv(*a) s/LVINTRO
322# 4  <2> sassign sKS/2
323# 5  <1> leavesub[1 ref] K/REFC,1
324EONT_EONT
325
326checkOptree ( name	=> 'my $a=()',
327	      prog	=> 'my $a=()',
328	      bcopts	=> '-exec',
329	      strip_open_hints => 1,
330	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3311  <0> enter
3322  <;> nextstate(main 1 -e:1) v:>,<,%,{
3333  <0> stub sP
3344  <0> padsv[$a:1,2] sRM*/LVINTRO
3355  <2> sassign vKS/2
3366  <@> leave[1 ref] vKP/REFC
337EOT_EOT
338# 1  <0> enter
339# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
340# 3  <0> stub sP
341# 4  <0> padsv[$a:1,2] sRM*/LVINTRO
342# 5  <2> sassign vKS/2
343# 6  <@> leave[1 ref] vKP/REFC
344EONT_EONT
345
346checkOptree ( name	=> 'our $a=()',
347	      prog	=> 'our $a=()',
348              #todo	=> 'probly not worth doing',
349	      bcopts	=> '-exec',
350	      strip_open_hints => 1,
351	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3521  <0> enter
3532  <;> nextstate(main 1 -e:1) v:>,<,%,{
3543  <0> stub sP
3554  <#> gvsv[*a] s/OURINTR
3565  <2> sassign vKS/2
3576  <@> leave[1 ref] vKP/REFC
358EOT_EOT
359# 1  <0> enter
360# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
361# 3  <0> stub sP
362# 4  <$> gvsv(*a) s/OURINTR
363# 5  <2> sassign vKS/2
364# 6  <@> leave[1 ref] vKP/REFC
365EONT_EONT
366
367checkOptree ( name	=> 'local $a=()',
368	      prog	=> 'local $a=()',
369	      errs      => ['Name "main::a" used only once: possible typo at -e line 1.'],
370              #todo	=> 'probly not worth doing',
371	      bcopts	=> '-exec',
372	      strip_open_hints => 1,
373	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3741  <0> enter
3752  <;> nextstate(main 1 -e:1) v:>,<,%,{
3763  <0> stub sP
3774  <#> gvsv[*a] s/LVINTRO
3785  <2> sassign vKS/2
3796  <@> leave[1 ref] vKP/REFC
380EOT_EOT
381# 1  <0> enter
382# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
383# 3  <0> stub sP
384# 4  <$> gvsv(*a) s/LVINTRO
385# 5  <2> sassign vKS/2
386# 6  <@> leave[1 ref] vKP/REFC
387EONT_EONT
388
389checkOptree ( name	=> 'my ($a,$b)=()',
390	      prog	=> 'my ($a,$b)=()',
391              #todo	=> 'probly not worth doing',
392	      bcopts	=> '-exec',
393	      strip_open_hints => 1,
394	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
395# 1  <0> enter
396# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
397# 3  <0> pushmark s
398# 4  <0> pushmark sRM*/128
399# 5  <0> padsv[$a:1,2] lRM*/LVINTRO
400# 6  <0> padsv[$b:1,2] lRM*/LVINTRO
401# 7  <2> aassign[t3] vKS
402# 8  <@> leave[1 ref] vKP/REFC
403EOT_EOT
404# 1  <0> enter
405# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
406# 3  <0> pushmark s
407# 4  <0> pushmark sRM*/128
408# 5  <0> padsv[$a:1,2] lRM*/LVINTRO
409# 6  <0> padsv[$b:1,2] lRM*/LVINTRO
410# 7  <2> aassign[t3] vKS
411# 8  <@> leave[1 ref] vKP/REFC
412EONT_EONT
413
414} #skip
415
416__END__
417
418