xref: /openbsd-src/gnu/usr.bin/perl/ext/XS-APItest/t/arrayexpr.t (revision 898184e3e61f9129feb5978fad5a8c6865f00b92)
1*898184e3Ssthenuse warnings;
2*898184e3Ssthenuse strict;
3*898184e3Ssthen
4*898184e3Ssthenuse Test::More tests => 2*10;
5*898184e3Ssthen
6*898184e3SsthenBEGIN { $^H |= 0x20000; }
7*898184e3Ssthen
8*898184e3Ssthenmy @t;
9*898184e3Ssthen
10*898184e3Ssthensub mymap(&@) { my $sub = shift; return map { $sub->($_) } @_; }
11*898184e3Ssthensub myneg(@) { return map { -$_ } @_; }
12*898184e3Ssthenpackage AA { sub listmeth { shift; return map { -$_ } @_; } }
13*898184e3Ssthen
14*898184e3Ssthen@t = ();
15*898184e3Sstheneval q{
16*898184e3Ssthen	use XS::APItest qw(arrayfullexpr);
17*898184e3Ssthen	no warnings "void";
18*898184e3Ssthen	push @t, arrayfullexpr 1+2;
19*898184e3Ssthen	push @t, arrayfullexpr 0 || 2;
20*898184e3Ssthen	push @t, arrayfullexpr 1 || 2;
21*898184e3Ssthen	push @t, arrayfullexpr 0 || 2, 3;
22*898184e3Ssthen	push @t, arrayfullexpr 1 || 2, 3;
23*898184e3Ssthen	push @t, arrayfullexpr 1, 2;
24*898184e3Ssthen	push @t, arrayfullexpr 0 or 2;
25*898184e3Ssthen	push @t, arrayfullexpr 1 or 2;
26*898184e3Ssthen	push @t, arrayfullexpr 0 or 2, 3;
27*898184e3Ssthen	push @t, arrayfullexpr 1 or 2, 3;
28*898184e3Ssthen	{ push @t, arrayfullexpr 1, 2 }
29*898184e3Ssthen	push @t, (arrayfullexpr 1, 2), 3;
30*898184e3Ssthen	push @t, arrayfullexpr do { 1; 1 }, 2;
31*898184e3Ssthen	push @t, arrayfullexpr 3, 4 if 1;
32*898184e3Ssthen	push @t, arrayfullexpr 5, 6 if 0;
33*898184e3Ssthen	push @t, arrayfullexpr (7, 8), 9;
34*898184e3Ssthen	push @t, arrayfullexpr a => "b";
35*898184e3Ssthen	push @t, arrayfullexpr 1 ? reverse 2, 3 : 4, 5;
36*898184e3Ssthen	push @t, arrayfullexpr 0 ? reverse 2, 3 : 4, 5;
37*898184e3Ssthen	push @t, 1 ? reverse arrayfullexpr 2, 3 : 4, 5;
38*898184e3Ssthen	push @t, 0 ? reverse arrayfullexpr 2, 3 : 4, 5;
39*898184e3Ssthen	push @t, arrayfullexpr reverse 1, 2, 3;
40*898184e3Ssthen	push @t, sub { arrayfullexpr return 1, 2, 3 }->();
41*898184e3Ssthen	push @t, arrayfullexpr myneg 1, 2, 3;
42*898184e3Ssthen	push @t, arrayfullexpr map { -$_ } 1, 2, 3;
43*898184e3Ssthen	push @t, arrayfullexpr mymap { -$_[0] } 1, 2, 3;
44*898184e3Ssthen	push @t, arrayfullexpr AA->listmeth(1, 2), 3;
45*898184e3Ssthen	push @t, arrayfullexpr listmeth AA (1, 2), 3;
46*898184e3Ssthen	push @t, arrayfullexpr listmeth AA 1, 2, 3;
47*898184e3Ssthen	push @t, arrayfullexpr not 1, 2;
48*898184e3Ssthen	push @t, arrayfullexpr reverse 6, 7, 8 or 9;
49*898184e3Ssthen	push @t, arrayfullexpr reverse 6, 7, 8 and 9;
50*898184e3Ssthen	push @t, arrayfullexpr 1 << 2;
51*898184e3Ssthen	push @t, arrayfullexpr 7 < 8;
52*898184e3Ssthen};
53*898184e3Ssthenis $@, "";
54*898184e3Ssthenis_deeply \@t, [
55*898184e3Ssthen	[3],
56*898184e3Ssthen	[2],
57*898184e3Ssthen	[1],
58*898184e3Ssthen	[2,3],
59*898184e3Ssthen	[1,3],
60*898184e3Ssthen	[1,2],
61*898184e3Ssthen	[2],
62*898184e3Ssthen	[1],
63*898184e3Ssthen	[2,3],
64*898184e3Ssthen	[1],
65*898184e3Ssthen	[1,2],
66*898184e3Ssthen	[1,2], 3,
67*898184e3Ssthen	[1,2],
68*898184e3Ssthen	[3,4],
69*898184e3Ssthen	[7,8,9],
70*898184e3Ssthen	["a","b"],
71*898184e3Ssthen	[3,2,5],
72*898184e3Ssthen	[4,5],
73*898184e3Ssthen	[2,3], 5,
74*898184e3Ssthen	4, 5,
75*898184e3Ssthen	[3,2,1],
76*898184e3Ssthen	1, 2, 3,
77*898184e3Ssthen	[-1,-2,-3],
78*898184e3Ssthen	[-1,-2,-3],
79*898184e3Ssthen	[-1,-2,-3],
80*898184e3Ssthen	[-1,-2,3],
81*898184e3Ssthen	[-1,-2,3],
82*898184e3Ssthen	[-1,-2,-3],
83*898184e3Ssthen	[!1],
84*898184e3Ssthen	[876],
85*898184e3Ssthen	[9],
86*898184e3Ssthen	[4],
87*898184e3Ssthen	[!!1],
88*898184e3Ssthen];
89*898184e3Ssthen
90*898184e3Ssthen@t = ();
91*898184e3Sstheneval q{
92*898184e3Ssthen	use XS::APItest qw(arraylistexpr);
93*898184e3Ssthen	no warnings "void";
94*898184e3Ssthen	push @t, arraylistexpr 1+2;
95*898184e3Ssthen	push @t, arraylistexpr 0 || 2;
96*898184e3Ssthen	push @t, arraylistexpr 1 || 2;
97*898184e3Ssthen	push @t, arraylistexpr 0 || 2, 3;
98*898184e3Ssthen	push @t, arraylistexpr 1 || 2, 3;
99*898184e3Ssthen	push @t, arraylistexpr 1, 2;
100*898184e3Ssthen	push @t, arraylistexpr 0 or 2;
101*898184e3Ssthen	push @t, arraylistexpr 1 or 2;
102*898184e3Ssthen	push @t, arraylistexpr 0 or 2, 3;
103*898184e3Ssthen	push @t, arraylistexpr 1 or 2, 3;
104*898184e3Ssthen	{ push @t, arraylistexpr 1, 2 }
105*898184e3Ssthen	push @t, (arraylistexpr 1, 2), 3;
106*898184e3Ssthen	push @t, arraylistexpr do { 1; 1 }, 2;
107*898184e3Ssthen	push @t, arraylistexpr 3, 4 if 1;
108*898184e3Ssthen	push @t, arraylistexpr 5, 6 if 0;
109*898184e3Ssthen	push @t, arraylistexpr (7, 8), 9;
110*898184e3Ssthen	push @t, arraylistexpr a => "b";
111*898184e3Ssthen	push @t, arraylistexpr 1 ? reverse 2, 3 : 4, 5;
112*898184e3Ssthen	push @t, arraylistexpr 0 ? reverse 2, 3 : 4, 5;
113*898184e3Ssthen	push @t, 1 ? reverse arraylistexpr 2, 3 : 4, 5;
114*898184e3Ssthen	push @t, 0 ? reverse arraylistexpr 2, 3 : 4, 5;
115*898184e3Ssthen	push @t, arraylistexpr reverse 1, 2, 3;
116*898184e3Ssthen	push @t, sub { arraylistexpr return 1, 2, 3 }->();
117*898184e3Ssthen	push @t, arraylistexpr myneg 1, 2, 3;
118*898184e3Ssthen	push @t, arraylistexpr map { -$_ } 1, 2, 3;
119*898184e3Ssthen	push @t, arraylistexpr mymap { -$_[0] } 1, 2, 3;
120*898184e3Ssthen	push @t, arraylistexpr AA->listmeth(1, 2), 3;
121*898184e3Ssthen	push @t, arraylistexpr listmeth AA (1, 2), 3;
122*898184e3Ssthen	push @t, arraylistexpr listmeth AA 1, 2, 3;
123*898184e3Ssthen	push @t, arraylistexpr not 1, 2;
124*898184e3Ssthen	push @t, arraylistexpr reverse 6, 7, 8 or 9;
125*898184e3Ssthen	push @t, arraylistexpr reverse 6, 7, 8 and 9;
126*898184e3Ssthen	push @t, arraylistexpr 1 << 2;
127*898184e3Ssthen	push @t, arraylistexpr 7 < 8;
128*898184e3Ssthen};
129*898184e3Ssthenis $@, "";
130*898184e3Ssthenis_deeply \@t, [
131*898184e3Ssthen	[3],
132*898184e3Ssthen	[2],
133*898184e3Ssthen	[1],
134*898184e3Ssthen	[2,3],
135*898184e3Ssthen	[1,3],
136*898184e3Ssthen	[1,2],
137*898184e3Ssthen	[0],
138*898184e3Ssthen	[1],
139*898184e3Ssthen	[0],
140*898184e3Ssthen	[1],
141*898184e3Ssthen	[1,2],
142*898184e3Ssthen	[1,2], 3,
143*898184e3Ssthen	[1,2],
144*898184e3Ssthen	[3,4],
145*898184e3Ssthen	[7,8,9],
146*898184e3Ssthen	["a","b"],
147*898184e3Ssthen	[3,2,5],
148*898184e3Ssthen	[4,5],
149*898184e3Ssthen	[2,3], 5,
150*898184e3Ssthen	4, 5,
151*898184e3Ssthen	[3,2,1],
152*898184e3Ssthen	1, 2, 3,
153*898184e3Ssthen	[-1,-2,-3],
154*898184e3Ssthen	[-1,-2,-3],
155*898184e3Ssthen	[-1,-2,-3],
156*898184e3Ssthen	[-1,-2,3],
157*898184e3Ssthen	[-1,-2,3],
158*898184e3Ssthen	[-1,-2,-3],
159*898184e3Ssthen	[!1],
160*898184e3Ssthen	[8,7,6],
161*898184e3Ssthen	[8,7,6],
162*898184e3Ssthen	[4],
163*898184e3Ssthen	[!!1],
164*898184e3Ssthen];
165*898184e3Ssthen
166*898184e3Ssthen@t = ();
167*898184e3Sstheneval q{
168*898184e3Ssthen	use XS::APItest qw(arraytermexpr);
169*898184e3Ssthen	no warnings "void";
170*898184e3Ssthen	push @t, arraytermexpr 1+2;
171*898184e3Ssthen	push @t, arraytermexpr 0 || 2;
172*898184e3Ssthen	push @t, arraytermexpr 1 || 2;
173*898184e3Ssthen	push @t, arraytermexpr 0 || 2, 3;
174*898184e3Ssthen	push @t, arraytermexpr 1 || 2, 3;
175*898184e3Ssthen	push @t, arraytermexpr 1, 2;
176*898184e3Ssthen	push @t, arraytermexpr 0 or 2;
177*898184e3Ssthen	push @t, arraytermexpr 1 or 2;
178*898184e3Ssthen	push @t, arraytermexpr 0 or 2, 3;
179*898184e3Ssthen	push @t, arraytermexpr 1 or 2, 3;
180*898184e3Ssthen	{ push @t, arraytermexpr 1 }
181*898184e3Ssthen	push @t, (arraytermexpr 1, 2), 3;
182*898184e3Ssthen	push @t, arraytermexpr do { 1; 1 }, 2;
183*898184e3Ssthen	push @t, arraytermexpr 3, 4 if 1;
184*898184e3Ssthen	push @t, arraytermexpr 5, 6 if 0;
185*898184e3Ssthen	push @t, arraytermexpr (7, 8), 9;
186*898184e3Ssthen	push @t, arraytermexpr a => "b";
187*898184e3Ssthen	push @t, arraytermexpr 1 ? reverse 2, 3 : 4, 5;
188*898184e3Ssthen	push @t, arraytermexpr 0 ? reverse 2, 3 : 4, 5;
189*898184e3Ssthen	push @t, 1 ? reverse arraytermexpr 2, 3 : 4, 5;
190*898184e3Ssthen	push @t, 0 ? reverse arraytermexpr 2, 3 : 4, 5;
191*898184e3Ssthen	push @t, arraytermexpr reverse 1, 2, 3;
192*898184e3Ssthen	push @t, sub { arraytermexpr return 1, 2, 3 }->();
193*898184e3Ssthen	push @t, arraytermexpr myneg 1, 2, 3;
194*898184e3Ssthen	push @t, arraytermexpr map { -$_ } 1, 2, 3;
195*898184e3Ssthen	push @t, arraytermexpr mymap { -$_[0] } 1, 2, 3;
196*898184e3Ssthen	push @t, arraytermexpr AA->listmeth(1, 2), 3;
197*898184e3Ssthen	push @t, arraytermexpr listmeth AA (1, 2), 3;
198*898184e3Ssthen	push @t, arraytermexpr listmeth AA 1, 2, 3;
199*898184e3Ssthen	push @t, arraytermexpr not 1, 2;
200*898184e3Ssthen	push @t, arraytermexpr reverse 6, 7, 8 or 9;
201*898184e3Ssthen	push @t, arraytermexpr reverse 6, 7, 8 and 9;
202*898184e3Ssthen	push @t, arraytermexpr 1 << 2;
203*898184e3Ssthen	push @t, arraytermexpr 7 < 8;
204*898184e3Ssthen};
205*898184e3Ssthenis $@, "";
206*898184e3Ssthenis_deeply \@t, [
207*898184e3Ssthen	[3],
208*898184e3Ssthen	[2],
209*898184e3Ssthen	[1],
210*898184e3Ssthen	[2], 3,
211*898184e3Ssthen	[1], 3,
212*898184e3Ssthen	[1], 2,
213*898184e3Ssthen	[0],
214*898184e3Ssthen	[1],
215*898184e3Ssthen	[0],
216*898184e3Ssthen	[1],
217*898184e3Ssthen	[1],
218*898184e3Ssthen	[1], 2, 3,
219*898184e3Ssthen	[1], 2,
220*898184e3Ssthen	[3], 4,
221*898184e3Ssthen	[7,8], 9,
222*898184e3Ssthen	["a"], "b",
223*898184e3Ssthen	[3,2], 5,
224*898184e3Ssthen	[4], 5,
225*898184e3Ssthen	3, [2], 5,
226*898184e3Ssthen	4, 5,
227*898184e3Ssthen	[3,2,1],
228*898184e3Ssthen	1, 2, 3,
229*898184e3Ssthen	[-1,-2,-3],
230*898184e3Ssthen	[-1,-2,-3],
231*898184e3Ssthen	[-1,-2,-3],
232*898184e3Ssthen	[-1,-2], 3,
233*898184e3Ssthen	[-1,-2], 3,
234*898184e3Ssthen	[-1,-2,-3],
235*898184e3Ssthen	[!1],
236*898184e3Ssthen	[8,7,6],
237*898184e3Ssthen	[8,7,6],
238*898184e3Ssthen	[4],
239*898184e3Ssthen	[!!1],
240*898184e3Ssthen];
241*898184e3Ssthen
242*898184e3Ssthen@t = ();
243*898184e3Sstheneval q{
244*898184e3Ssthen	use XS::APItest qw(arrayarithexpr);
245*898184e3Ssthen	no warnings "void";
246*898184e3Ssthen	push @t, arrayarithexpr 1+2;
247*898184e3Ssthen	push @t, arrayarithexpr 0 || 2;
248*898184e3Ssthen	push @t, arrayarithexpr 1 || 2;
249*898184e3Ssthen	push @t, arrayarithexpr 0 || 2, 3;
250*898184e3Ssthen	push @t, arrayarithexpr 1 || 2, 3;
251*898184e3Ssthen	push @t, arrayarithexpr 1, 2;
252*898184e3Ssthen	push @t, arrayarithexpr 0 or 2;
253*898184e3Ssthen	push @t, arrayarithexpr 1 or 2;
254*898184e3Ssthen	push @t, arrayarithexpr 0 or 2, 3;
255*898184e3Ssthen	push @t, arrayarithexpr 1 or 2, 3;
256*898184e3Ssthen	{ push @t, arrayarithexpr 1 }
257*898184e3Ssthen	push @t, (arrayarithexpr 1, 2), 3;
258*898184e3Ssthen	push @t, arrayarithexpr do { 1; 1 }, 2;
259*898184e3Ssthen	push @t, arrayarithexpr 3, 4 if 1;
260*898184e3Ssthen	push @t, arrayarithexpr 5, 6 if 0;
261*898184e3Ssthen	push @t, arrayarithexpr (7, 8), 9;
262*898184e3Ssthen	push @t, arrayarithexpr a => "b";
263*898184e3Ssthen	push @t, arrayarithexpr 1 ? reverse 2, 3 : 4, 5;
264*898184e3Ssthen	push @t, arrayarithexpr 0 ? reverse 2, 3 : 4, 5;
265*898184e3Ssthen	push @t, 1 ? reverse arrayarithexpr 2, 3 : 4, 5;
266*898184e3Ssthen	push @t, 0 ? reverse arrayarithexpr 2, 3 : 4, 5;
267*898184e3Ssthen	push @t, arrayarithexpr reverse 1, 2, 3;
268*898184e3Ssthen	push @t, sub { arrayarithexpr return 1, 2, 3 }->();
269*898184e3Ssthen	push @t, arrayarithexpr myneg 1, 2, 3;
270*898184e3Ssthen	push @t, arrayarithexpr map { -$_ } 1, 2, 3;
271*898184e3Ssthen	push @t, arrayarithexpr mymap { -$_[0] } 1, 2, 3;
272*898184e3Ssthen	push @t, arrayarithexpr AA->listmeth(1, 2), 3;
273*898184e3Ssthen	push @t, arrayarithexpr listmeth AA (1, 2), 3;
274*898184e3Ssthen	push @t, arrayarithexpr listmeth AA 1, 2, 3;
275*898184e3Ssthen	push @t, arrayarithexpr not 1, 2;
276*898184e3Ssthen	push @t, arrayarithexpr reverse 6, 7, 8 or 9;
277*898184e3Ssthen	push @t, arrayarithexpr reverse 6, 7, 8 and 9;
278*898184e3Ssthen	push @t, arrayarithexpr 1 << 2;
279*898184e3Ssthen	push @t, arrayarithexpr 7 < 8;
280*898184e3Ssthen};
281*898184e3Ssthenis $@, "";
282*898184e3Ssthenis_deeply \@t, [
283*898184e3Ssthen	[3],
284*898184e3Ssthen	[0],
285*898184e3Ssthen	[1],
286*898184e3Ssthen	[0], 3,
287*898184e3Ssthen	[1], 3,
288*898184e3Ssthen	[1], 2,
289*898184e3Ssthen	[0],
290*898184e3Ssthen	[1],
291*898184e3Ssthen	[0],
292*898184e3Ssthen	[1],
293*898184e3Ssthen	[1],
294*898184e3Ssthen	[1], 2, 3,
295*898184e3Ssthen	[1], 2,
296*898184e3Ssthen	[3], 4,
297*898184e3Ssthen	[7,8], 9,
298*898184e3Ssthen	["a"], "b",
299*898184e3Ssthen	3, 2, 5,
300*898184e3Ssthen	3, 2, 5,
301*898184e3Ssthen	3, [2], 5,
302*898184e3Ssthen	4, 5,
303*898184e3Ssthen	[3,2,1],
304*898184e3Ssthen	1, 2, 3,
305*898184e3Ssthen	[-1,-2,-3],
306*898184e3Ssthen	[-1,-2,-3],
307*898184e3Ssthen	[-1,-2,-3],
308*898184e3Ssthen	[-1,-2], 3,
309*898184e3Ssthen	[-1,-2], 3,
310*898184e3Ssthen	[-1,-2,-3],
311*898184e3Ssthen	[!1],
312*898184e3Ssthen	[8,7,6],
313*898184e3Ssthen	[8,7,6],
314*898184e3Ssthen	[4],
315*898184e3Ssthen	!!0,
316*898184e3Ssthen];
317*898184e3Ssthen
318*898184e3Ssthen@t = ();
319*898184e3Sstheneval q{
320*898184e3Ssthen	use XS::APItest qw(arrayexprflags);
321*898184e3Ssthen	push @t, arrayexprflags! 1, 2;
322*898184e3Ssthen};
323*898184e3Ssthenis $@, "";
324*898184e3Ssthenis_deeply \@t, [ [1,2] ];
325*898184e3Ssthen
326*898184e3Ssthen@t = ();
327*898184e3Sstheneval q{
328*898184e3Ssthen	use XS::APItest qw(arrayexprflags);
329*898184e3Ssthen	push @t, arrayexprflags? 1, 2;
330*898184e3Ssthen};
331*898184e3Ssthenis $@, "";
332*898184e3Ssthenis_deeply \@t, [ [1,2] ];
333*898184e3Ssthen
334*898184e3Ssthen@t = ();
335*898184e3Sstheneval q{
336*898184e3Ssthen	use XS::APItest qw(arrayexprflags);
337*898184e3Ssthen	push @t, arrayexprflags! [);
338*898184e3Ssthen};
339*898184e3Ssthenlike $@, qr/\A(?:Parse|syntax) error/;
340*898184e3Ssthenis_deeply \@t, [];
341*898184e3Ssthen
342*898184e3Ssthen@t = ();
343*898184e3Sstheneval q{
344*898184e3Ssthen	use XS::APItest qw(arrayexprflags);
345*898184e3Ssthen	push @t, arrayexprflags? [);
346*898184e3Ssthen};
347*898184e3Ssthenlike $@, qr/\A(?:Parse|syntax) error/;
348*898184e3Ssthenis_deeply \@t, [];
349*898184e3Ssthen
350*898184e3Ssthen@t = ();
351*898184e3Sstheneval q{
352*898184e3Ssthen	use XS::APItest qw(arrayexprflags);
353*898184e3Ssthen	push @t, arrayexprflags! ;
354*898184e3Ssthen};
355*898184e3Ssthenlike $@, qr/\A(?:Parse|syntax) error/;
356*898184e3Ssthenis_deeply \@t, [];
357*898184e3Ssthen
358*898184e3Ssthen@t = ();
359*898184e3Sstheneval q{
360*898184e3Ssthen	use XS::APItest qw(arrayexprflags);
361*898184e3Ssthen	push @t, arrayexprflags? ;
362*898184e3Ssthen};
363*898184e3Ssthenis $@, "";
364*898184e3Ssthenis_deeply \@t, [ {} ];
365*898184e3Ssthen
366*898184e3Ssthen1;
367