The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
use Test::More tests => 2*10;
BEGIN { $^H |= 0x20000; }
my @t;
sub mymap(&@) { my $sub = shift; return map { $sub->($_) } @_; }
sub myneg(@) { return map { -$_ } @_; }
package AA { sub listmeth { shift; return map { -$_ } @_; } }
@t = ();
eval q{
use XS::APItest qw(arrayfullexpr);
no warnings "void";
push @t, arrayfullexpr 1+2;
push @t, arrayfullexpr 0 || 2;
push @t, arrayfullexpr 1 || 2;
push @t, arrayfullexpr 0 || 2, 3;
push @t, arrayfullexpr 1 || 2, 3;
push @t, arrayfullexpr 1, 2;
push @t, arrayfullexpr 0 or 2;
push @t, arrayfullexpr 1 or 2;
push @t, arrayfullexpr 0 or 2, 3;
push @t, arrayfullexpr 1 or 2, 3;
{ push @t, arrayfullexpr 1, 2 }
push @t, (arrayfullexpr 1, 2), 3;
push @t, arrayfullexpr do { 1; 1 }, 2;
push @t, arrayfullexpr 3, 4 if 1;
push @t, arrayfullexpr 5, 6 if 0;
push @t, arrayfullexpr (7, 8), 9;
push @t, arrayfullexpr a => "b";
push @t, arrayfullexpr 1 ? reverse 2, 3 : 4, 5;
push @t, arrayfullexpr 0 ? reverse 2, 3 : 4, 5;
push @t, 1 ? reverse arrayfullexpr 2, 3 : 4, 5;
push @t, 0 ? reverse arrayfullexpr 2, 3 : 4, 5;
push @t, arrayfullexpr reverse 1, 2, 3;
push @t, sub { arrayfullexpr return 1, 2, 3 }->();
push @t, arrayfullexpr myneg 1, 2, 3;
push @t, arrayfullexpr map { -$_ } 1, 2, 3;
push @t, arrayfullexpr mymap { -$_[0] } 1, 2, 3;
push @t, arrayfullexpr AA->listmeth(1, 2), 3;
push @t, arrayfullexpr listmeth AA (1, 2), 3;
push @t, arrayfullexpr listmeth AA 1, 2, 3;
push @t, arrayfullexpr not 1, 2;
push @t, arrayfullexpr reverse 6, 7, 8 or 9;
push @t, arrayfullexpr reverse 6, 7, 8 and 9;
push @t, arrayfullexpr 1 << 2;
push @t, arrayfullexpr 7 < 8;
};
is $@, "";
is_deeply \@t, [
[3],
[2],
[1],
[2,3],
[1,3],
[1,2],
[2],
[1],
[2,3],
[1],
[1,2],
[1,2], 3,
[1,2],
[3,4],
[7,8,9],
["a","b"],
[3,2,5],
[4,5],
[2,3], 5,
4, 5,
[3,2,1],
1, 2, 3,
[-1,-2,-3],
[-1,-2,-3],
[-1,-2,-3],
[-1,-2,3],
[-1,-2,3],
[-1,-2,-3],
[!1],
[876],
[9],
[4],
[!!1],
];
@t = ();
eval q{
use XS::APItest qw(arraylistexpr);
no warnings "void";
push @t, arraylistexpr 1+2;
push @t, arraylistexpr 0 || 2;
push @t, arraylistexpr 1 || 2;
push @t, arraylistexpr 0 || 2, 3;
push @t, arraylistexpr 1 || 2, 3;
push @t, arraylistexpr 1, 2;
push @t, arraylistexpr 0 or 2;
push @t, arraylistexpr 1 or 2;
push @t, arraylistexpr 0 or 2, 3;
push @t, arraylistexpr 1 or 2, 3;
{ push @t, arraylistexpr 1, 2 }
push @t, (arraylistexpr 1, 2), 3;
push @t, arraylistexpr do { 1; 1 }, 2;
push @t, arraylistexpr 3, 4 if 1;
push @t, arraylistexpr 5, 6 if 0;
push @t, arraylistexpr (7, 8), 9;
push @t, arraylistexpr a => "b";
push @t, arraylistexpr 1 ? reverse 2, 3 : 4, 5;
push @t, arraylistexpr 0 ? reverse 2, 3 : 4, 5;
push @t, 1 ? reverse arraylistexpr 2, 3 : 4, 5;
push @t, 0 ? reverse arraylistexpr 2, 3 : 4, 5;
push @t, arraylistexpr reverse 1, 2, 3;
push @t, sub { arraylistexpr return 1, 2, 3 }->();
push @t, arraylistexpr myneg 1, 2, 3;
push @t, arraylistexpr map { -$_ } 1, 2, 3;
push @t, arraylistexpr mymap { -$_[0] } 1, 2, 3;
push @t, arraylistexpr AA->listmeth(1, 2), 3;
push @t, arraylistexpr listmeth AA (1, 2), 3;
push @t, arraylistexpr listmeth AA 1, 2, 3;
push @t, arraylistexpr not 1, 2;
push @t, arraylistexpr reverse 6, 7, 8 or 9;
push @t, arraylistexpr reverse 6, 7, 8 and 9;
push @t, arraylistexpr 1 << 2;
push @t, arraylistexpr 7 < 8;
};
is $@, "";
is_deeply \@t, [
[3],
[2],
[1],
[2,3],
[1,3],
[1,2],
[0],
[1],
[0],
[1],
[1,2],
[1,2], 3,
[1,2],
[3,4],
[7,8,9],
["a","b"],
[3,2,5],
[4,5],
[2,3], 5,
4, 5,
[3,2,1],
1, 2, 3,
[-1,-2,-3],
[-1,-2,-3],
[-1,-2,-3],
[-1,-2,3],
[-1,-2,3],
[-1,-2,-3],
[!1],
[8,7,6],
[8,7,6],
[4],
[!!1],
];
@t = ();
eval q{
use XS::APItest qw(arraytermexpr);
no warnings "void";
push @t, arraytermexpr 1+2;
push @t, arraytermexpr 0 || 2;
push @t, arraytermexpr 1 || 2;
push @t, arraytermexpr 0 || 2, 3;
push @t, arraytermexpr 1 || 2, 3;
push @t, arraytermexpr 1, 2;
push @t, arraytermexpr 0 or 2;
push @t, arraytermexpr 1 or 2;
push @t, arraytermexpr 0 or 2, 3;
push @t, arraytermexpr 1 or 2, 3;
{ push @t, arraytermexpr 1 }
push @t, (arraytermexpr 1, 2), 3;
push @t, arraytermexpr do { 1; 1 }, 2;
push @t, arraytermexpr 3, 4 if 1;
push @t, arraytermexpr 5, 6 if 0;
push @t, arraytermexpr (7, 8), 9;
push @t, arraytermexpr a => "b";
push @t, arraytermexpr 1 ? reverse 2, 3 : 4, 5;
push @t, arraytermexpr 0 ? reverse 2, 3 : 4, 5;
push @t, 1 ? reverse arraytermexpr 2, 3 : 4, 5;
push @t, 0 ? reverse arraytermexpr 2, 3 : 4, 5;
push @t, arraytermexpr reverse 1, 2, 3;
push @t, sub { arraytermexpr return 1, 2, 3 }->();
push @t, arraytermexpr myneg 1, 2, 3;
push @t, arraytermexpr map { -$_ } 1, 2, 3;
push @t, arraytermexpr mymap { -$_[0] } 1, 2, 3;
push @t, arraytermexpr AA->listmeth(1, 2), 3;
push @t, arraytermexpr listmeth AA (1, 2), 3;
push @t, arraytermexpr listmeth AA 1, 2, 3;
push @t, arraytermexpr not 1, 2;
push @t, arraytermexpr reverse 6, 7, 8 or 9;
push @t, arraytermexpr reverse 6, 7, 8 and 9;
push @t, arraytermexpr 1 << 2;
push @t, arraytermexpr 7 < 8;
};
is $@, "";
is_deeply \@t, [
[3],
[2],
[1],
[2], 3,
[1], 3,
[1], 2,
[0],
[1],
[0],
[1],
[1],
[1], 2, 3,
[1], 2,
[3], 4,
[7,8], 9,
["a"], "b",
[3,2], 5,
[4], 5,
3, [2], 5,
4, 5,
[3,2,1],
1, 2, 3,
[-1,-2,-3],
[-1,-2,-3],
[-1,-2,-3],
[-1,-2], 3,
[-1,-2], 3,
[-1,-2,-3],
[!1],
[8,7,6],
[8,7,6],
[4],
[!!1],
];
@t = ();
eval q{
use XS::APItest qw(arrayarithexpr);
no warnings "void";
push @t, arrayarithexpr 1+2;
push @t, arrayarithexpr 0 || 2;
push @t, arrayarithexpr 1 || 2;
push @t, arrayarithexpr 0 || 2, 3;
push @t, arrayarithexpr 1 || 2, 3;
push @t, arrayarithexpr 1, 2;
push @t, arrayarithexpr 0 or 2;
push @t, arrayarithexpr 1 or 2;
push @t, arrayarithexpr 0 or 2, 3;
push @t, arrayarithexpr 1 or 2, 3;
{ push @t, arrayarithexpr 1 }
push @t, (arrayarithexpr 1, 2), 3;
push @t, arrayarithexpr do { 1; 1 }, 2;
push @t, arrayarithexpr 3, 4 if 1;
push @t, arrayarithexpr 5, 6 if 0;
push @t, arrayarithexpr (7, 8), 9;
push @t, arrayarithexpr a => "b";
push @t, arrayarithexpr 1 ? reverse 2, 3 : 4, 5;
push @t, arrayarithexpr 0 ? reverse 2, 3 : 4, 5;
push @t, 1 ? reverse arrayarithexpr 2, 3 : 4, 5;
push @t, 0 ? reverse arrayarithexpr 2, 3 : 4, 5;
push @t, arrayarithexpr reverse 1, 2, 3;
push @t, sub { arrayarithexpr return 1, 2, 3 }->();
push @t, arrayarithexpr myneg 1, 2, 3;
push @t, arrayarithexpr map { -$_ } 1, 2, 3;
push @t, arrayarithexpr mymap { -$_[0] } 1, 2, 3;
push @t, arrayarithexpr AA->listmeth(1, 2), 3;
push @t, arrayarithexpr listmeth AA (1, 2), 3;
push @t, arrayarithexpr listmeth AA 1, 2, 3;
push @t, arrayarithexpr not 1, 2;
push @t, arrayarithexpr reverse 6, 7, 8 or 9;
push @t, arrayarithexpr reverse 6, 7, 8 and 9;
push @t, arrayarithexpr 1 << 2;
push @t, arrayarithexpr 7 < 8;
};
is $@, "";
is_deeply \@t, [
[3],
[0],
[1],
[0], 3,
[1], 3,
[1], 2,
[0],
[1],
[0],
[1],
[1],
[1], 2, 3,
[1], 2,
[3], 4,
[7,8], 9,
["a"], "b",
3, 2, 5,
3, 2, 5,
3, [2], 5,
4, 5,
[3,2,1],
1, 2, 3,
[-1,-2,-3],
[-1,-2,-3],
[-1,-2,-3],
[-1,-2], 3,
[-1,-2], 3,
[-1,-2,-3],
[!1],
[8,7,6],
[8,7,6],
[4],
!!0,
];
@t = ();
eval q{
use XS::APItest qw(arrayexprflags);
push @t, arrayexprflags! 1, 2;
};
is $@, "";
is_deeply \@t, [ [1,2] ];
@t = ();
eval q{
use XS::APItest qw(arrayexprflags);
push @t, arrayexprflags? 1, 2;
};
is $@, "";
is_deeply \@t, [ [1,2] ];
@t = ();
eval q{
use XS::APItest qw(arrayexprflags);
push @t, arrayexprflags! [);
};
like $@, qr/\A(?:Parse|syntax) error/;
is_deeply \@t, [];
@t = ();
eval q{
use XS::APItest qw(arrayexprflags);
push @t, arrayexprflags? [);
};
like $@, qr/\A(?:Parse|syntax) error/;
is_deeply \@t, [];
@t = ();
eval q{
use XS::APItest qw(arrayexprflags);
push @t, arrayexprflags! ;
};
like $@, qr/\A(?:Parse|syntax) error/;
is_deeply \@t, [];
@t = ();
eval q{
use XS::APItest qw(arrayexprflags);
push @t, arrayexprflags? ;
};
is $@, "";
is_deeply \@t, [ {} ];
1;