xref: /openbsd/gnu/usr.bin/perl/ext/B/t/optree_varinit.t (revision 3d61058a)
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	=> 46;
13
14pass("OPTIMIZER TESTS - VAR INITIALIZATION");
15
16checkOptree ( name	=> 'sub {my $a}',
17	      bcopts	=> '-exec',
18	      code	=> sub {my $a},
19	      strip_open_hints => 1,
20	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
21# 1  <;> nextstate(main 45 optree.t:23) v:>,<,%
22# 2  <0> padsv[$a:45,46] sM/LVINTRO
23# 3  <1> leavesub[1 ref] K/REFC,1
24EOT_EOT
25# 1  <;> nextstate(main 45 optree.t:23) v:>,<,%
26# 2  <0> padsv[$a:45,46] sM/LVINTRO
27# 3  <1> leavesub[1 ref] K/REFC,1
28EONT_EONT
29
30checkOptree ( name	=> '-exec sub {my $a}',
31	      bcopts	=> '-exec',
32	      code	=> sub {my $a},
33	      strip_open_hints => 1,
34	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
35# 1  <;> nextstate(main 49 optree.t:52) v:>,<,%
36# 2  <0> padsv[$a:49,50] sM/LVINTRO
37# 3  <1> leavesub[1 ref] K/REFC,1
38EOT_EOT
39# 1  <;> nextstate(main 49 optree.t:45) v:>,<,%
40# 2  <0> padsv[$a:49,50] sM/LVINTRO
41# 3  <1> leavesub[1 ref] K/REFC,1
42EONT_EONT
43
44checkOptree ( name	=> 'sub {our $a}',
45	      bcopts	=> '-exec',
46	      code	=> sub {our $a},
47	      strip_open_hints => 1,
48	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
491  <;> nextstate(main 21 optree.t:47) v:>,<,%
502  <#> gvsv[*a] s/OURINTR
513  <1> leavesub[1 ref] K/REFC,1
52EOT_EOT
53# 1  <;> nextstate(main 51 optree.t:56) v:>,<,%
54# 2  <$> gvsv(*a) s/OURINTR
55# 3  <1> leavesub[1 ref] K/REFC,1
56EONT_EONT
57
58checkOptree ( name	=> 'sub {local $a}',
59	      bcopts	=> '-exec',
60	      code	=> sub {local $a},
61	      strip_open_hints => 1,
62	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
631  <;> nextstate(main 23 optree.t:57) v:>,<,%,{
642  <#> gvsv[*a] s/LVINTRO
653  <1> leavesub[1 ref] K/REFC,1
66EOT_EOT
67# 1  <;> nextstate(main 53 optree.t:67) v:>,<,%,{
68# 2  <$> gvsv(*a) s/LVINTRO
69# 3  <1> leavesub[1 ref] K/REFC,1
70EONT_EONT
71
72checkOptree ( name	=> 'my $a',
73	      prog	=> 'my $a',
74	      bcopts	=> '-basic',
75	      strip_open_hints => 1,
76	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
77# 4  <@> leave[1 ref] vKP/REFC ->(end)
78# 1     <0> enter v ->2
79# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
80# 3     <0> padsv[$a:1,2] vM/LVINTRO ->4
81EOT_EOT
82# 4  <@> leave[1 ref] vKP/REFC ->(end)
83# 1     <0> enter v ->2
84# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
85# 3     <0> padsv[$a:1,2] vM/LVINTRO ->4
86EONT_EONT
87
88checkOptree ( name	=> 'our $a',
89	      prog	=> 'our $a',
90	      bcopts	=> '-basic',
91	      strip_open_hints => 1,
92	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
933  <@> leave[1 ref] vKP/REFC ->(end)
941     <0> enter v ->2
952     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
96-     <1> rv2sv vK/OURINTR,1 ->3
97-        <#> gv[*a] s ->-
98EOT_EOT
99# 3  <@> leave[1 ref] vKP/REFC ->(end)
100# 1     <0> enter v ->2
101# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
102# -     <1> rv2sv vK/OURINTR,1 ->3
103# -        <$> gv(*a) s ->-
104EONT_EONT
105
106checkOptree ( name	=> 'local $c',
107	      prog	=> 'local $c',
108	      errs      => ['Name "main::c" used only once: possible typo at -e line 1.'],
109	      bcopts	=> '-basic',
110	      strip_open_hints => 1,
111	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1124  <@> leave[1 ref] vKP/REFC ->(end)
1131     <0> enter v ->2
1142     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
115-     <1> ex-rv2sv vKM/LVINTRO,1 ->4
1163        <#> gvsv[*c] s/LVINTRO ->4
117EOT_EOT
118# 4  <@> leave[1 ref] vKP/REFC ->(end)
119# 1     <0> enter v ->2
120# 2     <;> nextstate(main 1 -e:1) v:>,<,%,{ ->3
121# -     <1> ex-rv2sv vKM/LVINTRO,1 ->4
122# 3        <$> gvsv(*c) s/LVINTRO ->4
123EONT_EONT
124
125pass("MY, OUR, LOCAL, BOTH SUB AND MAIN, = undef");
126
127checkOptree ( name	=> 'sub {my $a=undef}',
128	      code	=> sub {my $a=undef},
129	      bcopts	=> '-basic',
130	      strip_open_hints => 1,
131	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1323  <1> leavesub[1 ref] K/REFC,1 ->(end)
133-     <@> lineseq KP ->3
1341        <;> nextstate(main 1517 optree_varinit.t:128) v ->2
135-        <1> ex-sassign sKS/2 ->-
1362           <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3
137-           <0> ex-padsv sRM*/LVINTRO ->-
138EOT_EOT
139# 3  <1> leavesub[1 ref] K/REFC,1 ->(end)
140# -     <@> lineseq KP ->3
141# 1        <;> nextstate(main 1517 optree_varinit.t:128) v ->2
142# -        <1> ex-sassign sKS/2 ->-
143# 2           <0> undef[$a:1517,1518] s/LVINTRO,KEEP_PV,TARGMY ->3
144# -           <0> ex-padsv sRM*/LVINTRO ->-
145EONT_EONT
146
147checkOptree ( name	=> 'sub {our $a=undef}',
148	      code	=> sub {our $a=undef},
149	      note	=> 'the global must be reset',
150	      bcopts	=> '-basic',
151	      strip_open_hints => 1,
152	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1535  <1> leavesub[1 ref] K/REFC,1 ->(end)
154-     <@> lineseq KP ->5
1551        <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2
1564        <2> sassign sKS/2 ->5
1572           <0> undef s ->3
158-           <1> ex-rv2sv sKRM*/OURINTR,1 ->4
1593              <#> gvsv[*a] s/OURINTR ->4
160EOT_EOT
161# 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
162# -     <@> lineseq KP ->5
163# 1        <;> nextstate(main 1520 optree_varinit.t:148) v:{ ->2
164# 4        <2> sassign sKS/2 ->5
165# 2           <0> undef s ->3
166# -           <1> ex-rv2sv sKRM*/OURINTR,1 ->4
167# 3              <$> gvsv(*a) s/OURINTR ->4
168EONT_EONT
169
170checkOptree ( name	=> 'sub {local $a=undef}',
171	      code	=> sub {local $a=undef},
172	      note	=> 'local not used enough to bother',
173	      bcopts	=> '-basic',
174	      strip_open_hints => 1,
175	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1765  <1> leavesub[1 ref] K/REFC,1 ->(end)
177-     <@> lineseq KP ->5
1781        <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2
1794        <2> sassign sKS/2 ->5
1802           <0> undef s ->3
181-           <1> ex-rv2sv sKRM*/LVINTRO,1 ->4
1823              <#> gvsv[*a] s/LVINTRO ->4
183EOT_EOT
184# 5  <1> leavesub[1 ref] K/REFC,1 ->(end)
185# -     <@> lineseq KP ->5
186# 1        <;> nextstate(main 1523 optree_varinit.t:171) v:{ ->2
187# 4        <2> sassign sKS/2 ->5
188# 2           <0> undef s ->3
189# -           <1> ex-rv2sv sKRM*/LVINTRO,1 ->4
190# 3              <$> gvsv(*a) s/LVINTRO ->4
191EONT_EONT
192
193checkOptree ( name	=> 'my $a=undef',
194	      prog	=> 'my $a=undef',
195	      bcopts	=> '-basic',
196	      strip_open_hints => 1,
197	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
1984  <@> leave[1 ref] vKP/REFC ->(end)
1991     <0> enter v ->2
2002     <;> nextstate(main 1 -e:1) v:{ ->3
201-     <1> ex-sassign vKS/2 ->4
2023        <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4
203-        <0> ex-padsv sRM*/LVINTRO ->-
204EOT_EOT
205# 4  <@> leave[1 ref] vKP/REFC ->(end)
206# 1     <0> enter v ->2
207# 2     <;> nextstate(main 1 -e:1) v:{ ->3
208# -     <1> ex-sassign vKS/2 ->4
209# 3        <0> undef[$a:1,2] s/LVINTRO,KEEP_PV,TARGMY ->4
210# -        <0> ex-padsv sRM*/LVINTRO ->-
211EONT_EONT
212
213checkOptree ( name	=> 'our $a=undef',
214	      prog	=> 'our $a=undef',
215	      note	=> 'global must be reassigned',
216	      bcopts	=> '-basic',
217	      strip_open_hints => 1,
218	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2196  <@> leave[1 ref] vKP/REFC ->(end)
2201     <0> enter v ->2
2212     <;> nextstate(main 1 -e:1) v:{ ->3
2225     <2> sassign vKS/2 ->6
2233        <0> undef s ->4
224-        <1> ex-rv2sv sKRM*/OURINTR,1 ->5
2254           <#> gvsv[*a] s/OURINTR ->5
226EOT_EOT
227# 6  <@> leave[1 ref] vKP/REFC ->(end)
228# 1     <0> enter v ->2
229# 2     <;> nextstate(main 1 -e:1) v:{ ->3
230# 5     <2> sassign vKS/2 ->6
231# 3        <0> undef s ->4
232# -        <1> ex-rv2sv sKRM*/OURINTR,1 ->5
233# 4           <$> gvsv(*a) s/OURINTR ->5
234EONT_EONT
235
236checkOptree ( name	=> 'local $c=undef',
237	      prog	=> 'local $c=undef',
238	      errs      => ['Name "main::c" used only once: possible typo at -e line 1.'],
239	      note	=> 'locals are rare, probably not worth doing',
240	      bcopts	=> '-basic',
241	      strip_open_hints => 1,
242	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2436  <@> leave[1 ref] vKP/REFC ->(end)
2441     <0> enter v ->2
2452     <;> nextstate(main 1 -e:1) v:{ ->3
2465     <2> sassign vKS/2 ->6
2473        <0> undef s ->4
248-        <1> ex-rv2sv sKRM*/LVINTRO,1 ->5
2494           <#> gvsv[*c] s/LVINTRO ->5
250EOT_EOT
251# 6  <@> leave[1 ref] vKP/REFC ->(end)
252# 1     <0> enter v ->2
253# 2     <;> nextstate(main 1 -e:1) v:{ ->3
254# 5     <2> sassign vKS/2 ->6
255# 3        <0> undef s ->4
256# -        <1> ex-rv2sv sKRM*/LVINTRO,1 ->5
257# 4           <$> gvsv(*c) s/LVINTRO ->5
258EONT_EONT
259
260checkOptree ( name	=> 'sub {my $a=()}',
261	      code	=> sub {my $a=()},
262	      bcopts	=> '-exec',
263	      strip_open_hints => 1,
264	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2651  <;> nextstate(main -439 optree.t:105) v:>,<,%
2662  <0> stub sP
2673  <1> padsv_store[$a:1516,1517] sKS/LVINTRO
2684  <1> leavesub[1 ref] K/REFC,1
269EOT_EOT
270# 1  <;> nextstate(main 438 optree_varinit.t:247) v:>,<,%
271# 2  <0> stub sP
272# 3  <1> padsv_store[$a:1516,1517] sKS/LVINTRO
273# 4  <1> leavesub[1 ref] K/REFC,1
274EONT_EONT
275
276checkOptree ( name	=> 'sub {our $a=()}',
277	      code	=> sub {our $a=()},
278              #todo	=> 'probly not worth doing',
279	      bcopts	=> '-exec',
280	      strip_open_hints => 1,
281	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
2821  <;> nextstate(main 31 optree.t:177) v:>,<,%,{
2832  <0> stub sP
2843  <#> gvsv[*a] s/OURINTR
2854  <2> sassign sKS/2
2865  <1> leavesub[1 ref] K/REFC,1
287EOT_EOT
288# 1  <;> nextstate(main 440 optree_varinit.t:262) v:>,<,%,{
289# 2  <0> stub sP
290# 3  <$> gvsv(*a) s/OURINTR
291# 4  <2> sassign sKS/2
292# 5  <1> leavesub[1 ref] K/REFC,1
293EONT_EONT
294
295checkOptree ( name	=> 'sub {local $a=()}',
296	      code	=> sub {local $a=()},
297              #todo	=> 'probly not worth doing',
298	      bcopts	=> '-exec',
299	      strip_open_hints => 1,
300	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3011  <;> nextstate(main 33 optree.t:190) v:>,<,%,{
3022  <0> stub sP
3033  <#> gvsv[*a] s/LVINTRO
3044  <2> sassign sKS/2
3055  <1> leavesub[1 ref] K/REFC,1
306EOT_EOT
307# 1  <;> nextstate(main 63 optree.t:225) v:>,<,%,{
308# 2  <0> stub sP
309# 3  <$> gvsv(*a) s/LVINTRO
310# 4  <2> sassign sKS/2
311# 5  <1> leavesub[1 ref] K/REFC,1
312EONT_EONT
313
314checkOptree ( name	=> 'my $a=()',
315	      prog	=> 'my $a=()',
316	      bcopts	=> '-exec',
317	      strip_open_hints => 1,
318	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3191  <0> enter v
3202  <;> nextstate(main 1 -e:1) v:>,<,%,{
3213  <0> stub sP
3224  <1> padsv_store[$a:1516,1517] vKS/LVINTRO
3235  <@> leave[1 ref] vKP/REFC
324EOT_EOT
325# 1  <0> enter v
326# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
327# 3  <0> stub sP
328# 4  <1> padsv_store[$a:1516,1517] vKS/LVINTRO
329# 5  <@> leave[1 ref] vKP/REFC
330EONT_EONT
331
332checkOptree ( name	=> 'our $a=()',
333	      prog	=> 'our $a=()',
334              #todo	=> 'probly not worth doing',
335	      bcopts	=> '-exec',
336	      strip_open_hints => 1,
337	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3381  <0> enter v
3392  <;> nextstate(main 1 -e:1) v:>,<,%,{
3403  <0> stub sP
3414  <#> gvsv[*a] s/OURINTR
3425  <2> sassign vKS/2
3436  <@> leave[1 ref] vKP/REFC
344EOT_EOT
345# 1  <0> enter v
346# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
347# 3  <0> stub sP
348# 4  <$> gvsv(*a) s/OURINTR
349# 5  <2> sassign vKS/2
350# 6  <@> leave[1 ref] vKP/REFC
351EONT_EONT
352
353checkOptree ( name	=> 'local $c=()',
354	      prog	=> 'local $c=()',
355	      errs      => ['Name "main::c" used only once: possible typo at -e line 1.'],
356              #todo	=> 'probly not worth doing',
357	      bcopts	=> '-exec',
358	      strip_open_hints => 1,
359	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
3601  <0> enter v
3612  <;> nextstate(main 1 -e:1) v:>,<,%,{
3623  <0> stub sP
3634  <#> gvsv[*c] s/LVINTRO
3645  <2> sassign vKS/2
3656  <@> leave[1 ref] vKP/REFC
366EOT_EOT
367# 1  <0> enter v
368# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
369# 3  <0> stub sP
370# 4  <$> gvsv(*c) s/LVINTRO
371# 5  <2> sassign vKS/2
372# 6  <@> leave[1 ref] vKP/REFC
373EONT_EONT
374
375checkOptree ( name	=> 'my ($a,$b)=()',
376	      prog	=> 'my ($a,$b)=()',
377              #todo	=> 'probly not worth doing',
378	      bcopts	=> '-exec',
379	      strip_open_hints => 1,
380	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
381# 1  <0> enter v
382# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
383# 3  <0> pushmark s
384# 4  <0> padrange[$a:1,2; $b:1,2] RM/LVINTRO,range=2
385# 5  <2> aassign[t3] vKS
386# 6  <@> leave[1 ref] vKP/REFC
387EOT_EOT
388# 1  <0> enter v
389# 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
390# 3  <0> pushmark s
391# 4  <0> padrange[$a:1,2; $b:1,2] RM/LVINTRO,range=2
392# 5  <2> aassign[t3] vKS
393# 6  <@> leave[1 ref] vKP/REFC
394EONT_EONT
395
396checkOptree ( name	=> 'void context state',
397	      prog	=> 'use feature qw(state); state $x = 1; 1',
398	      bcopts	=> '-exec',
399	      strip_open_hints => 1,
400	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
401# 1  <0> enter v
402# 2  <;> nextstate(main 2 -e:1) v:%,{,fea=15
403# 3  <|> once(other->4)[$:2,3] vK/1
404# 4      <$> const[IV 1] s
405# 5      <1> padsv_store[$x:2,3] vKS/LVINTRO,STATE
406#            goto 6
407# 8  <0> padsv[$x:2,3] vRM*/STATE
408# 6  <;> nextstate(main 3 -e:1) v:%,{,fea=15
409# 7  <@> leave[1 ref] vKP/REFC
410EOT_EOT
411# 1  <0> enter v
412# 2  <;> nextstate(main 2 -e:1) v:%,{,fea=15
413# 3  <|> once(other->4)[$:2,3] vK/1
414# 4      <$> const(IV 1) s
415# 5      <1> padsv_store[$x:2,3] vKS/LVINTRO,STATE
416#            goto 6
417# 8  <0> padsv[$x:2,3] vRM*/STATE
418# 6  <;> nextstate(main 3 -e:1) v:%,{,fea=15
419# 7  <@> leave[1 ref] vKP/REFC
420EONT_EONT
421
422checkOptree ( name	=> 'scalar context state',
423	      prog	=> 'use feature qw(state); my $y = state $x = 1; 1',
424	      bcopts	=> '-exec',
425	      strip_open_hints => 1,
426	      expect	=> <<'EOT_EOT', expect_nt => <<'EONT_EONT');
427# 1  <0> enter v
428# 2  <;> nextstate(main 2 -e:1) v:%,{,fea=15
429# 3  <|> once(other->4)[$:2,3] sK/1
430# 4      <$> const[IV 1] s
431# 5      <1> padsv_store[$x:2,3] sKS/LVINTRO,STATE
432#            goto 6
433# 9  <0> padsv[$x:2,3] sRM*/STATE
434# 6  <1> padsv_store[$y:2,3] vKS/LVINTRO
435# 7  <;> nextstate(main 3 -e:1) v:%,{,fea=15
436# 8  <@> leave[1 ref] vKP/REFC
437EOT_EOT
438# 1  <0> enter v
439# 2  <;> nextstate(main 2 -e:1) v:%,{,fea=15
440# 3  <|> once(other->4)[$:2,3] sK/1
441# 4      <$> const(IV 1) s
442# 5      <1> padsv_store[$x:2,3] sKS/LVINTRO,STATE
443#            goto 6
444# 9  <0> padsv[$x:2,3] sRM*/STATE
445# 6  <1> padsv_store[$y:2,3] vKS/LVINTRO
446# 7  <;> nextstate(main 3 -e:1) v:%,{,fea=15
447# 8  <@> leave[1 ref] vKP/REFC
448EONT_EONT
449