1#!./perl 2 3BEGIN { 4 chdir 't' if -d 't'; 5 require "./test.pl"; 6 set_up_inc(qw(. ../lib)); 7} 8 9plan( tests => 73 ); 10 11@foo = (1, 2, 3, 4); 12cmp_ok($foo[0], '==', 1, 'first elem'); 13cmp_ok($foo[3], '==', 4, 'last elem'); 14 15$_ = join(':',@foo); 16cmp_ok($_, 'eq', '1:2:3:4', 'join list'); 17 18($a,$b,$c,$d) = (1,2,3,4); 19cmp_ok("$a;$b;$c;$d", 'eq', '1;2;3;4', 'list assign'); 20 21($c,$b,$a) = split(/ /,"111 222 333"); 22cmp_ok("$a;$b;$c",'eq','333;222;111','list split on space'); 23 24($a,$b,$c) = ($c,$b,$a); 25cmp_ok("$a;$b;$c",'eq','111;222;333','trio rotate'); 26 27($a, $b) = ($b, $a); 28cmp_ok("$a-$b",'eq','222-111','duo swap'); 29 30($a, $b) = ($b, $a) = ($a, $b); 31cmp_ok("$a-$b",'eq','222-111','duo swap swap'); 32 33($a, $b[1], $c{2}, $d) = (1, 2, 3, 4); 34cmp_ok($a,'==',1,'assign scalar in list'); 35cmp_ok($b[1],'==',2,'assign aelem in list'); 36cmp_ok($c{2},'==',3,'assign helem in list'); 37cmp_ok($d,'==',4,'assign last scalar in list'); 38 39@foo = (1,2,3,4,5,6,7,8); 40($a, $b, $c, $d) = @foo; 41cmp_ok("$a/$b/$c/$d",'eq','1/2/3/4','long list assign'); 42 43@foo = (1,2); 44($a, $b, $c, $d) = @foo; 45cmp_ok($a,'==',1,'short list 1 defined'); 46cmp_ok($b,'==',2,'short list 2 defined'); 47ok(!defined($c),'short list 3 undef'); 48ok(!defined($d),'short list 4 undef'); 49 50@foo = @bar = (1); 51cmp_ok(join(':',@foo,@bar),'eq','1:1','list reassign'); 52 53@foo = @bar = (2,3); 54cmp_ok(join(':',join('+',@foo),join('-',@bar)),'eq','2+3:2-3','long list reassign'); 55 56@foo = (); 57@foo = 1+2+3; 58cmp_ok(join(':',@foo),'eq','6','scalar assign to array'); 59 60{ 61 my ($a, $b, $c); 62 for ($x = 0; $x < 3; $x = $x + 1) { 63 ($a, $b, $c) = 64 $x == 0 ? ('a','b','c') 65 : $x == 1 ? ('d','e','f') 66 : ('g','h','i') 67 ; 68 if ($x == 0) { 69 cmp_ok($a,'eq','a','ternary for a 1'); 70 cmp_ok($b,'eq','b','ternary for b 1'); 71 cmp_ok($c,'eq','c','ternary for c 1'); 72 } 73 if ($x == 1) { 74 cmp_ok($a,'eq','d','ternary for a 2'); 75 cmp_ok($b,'eq','e','ternary for b 2'); 76 cmp_ok($c,'eq','f','ternary for c 2'); 77 } 78 if ($x == 2) { 79 cmp_ok($a,'eq','g','ternary for a 3'); 80 cmp_ok($b,'eq','h','ternary for b 3'); 81 cmp_ok($c,'eq','i','ternary for c 3'); 82 } 83 } 84} 85 86{ 87 my ($a, $b, $c); 88 for ($x = 0; $x < 3; $x = $x + 1) { 89 ($a, $b, $c) = do { 90 if ($x == 0) { 91 ('a','b','c'); 92 } 93 elsif ($x == 1) { 94 ('d','e','f'); 95 } 96 else { 97 ('g','h','i'); 98 } 99 }; 100 if ($x == 0) { 101 cmp_ok($a,'eq','a','block for a 1'); 102 cmp_ok($b,'eq','b','block for b 1'); 103 cmp_ok($c,'eq','c','block for c 1'); 104 } 105 if ($x == 1) { 106 cmp_ok($a,'eq','d','block for a 2'); 107 cmp_ok($b,'eq','e','block for b 2'); 108 cmp_ok($c,'eq','f','block for c 2'); 109 } 110 if ($x == 2) { 111 cmp_ok($a,'eq','g','block for a 3'); 112 cmp_ok($b,'eq','h','block for b 3'); 113 cmp_ok($c,'eq','i','block for c 3'); 114 } 115 } 116} 117 118$x = 666; 119@a = ($x == 12345 || (1,2,3)); 120cmp_ok(join('*',@a),'eq','1*2*3','logical or f'); 121 122@a = ($x == $x || (4,5,6)); 123cmp_ok(join('*',@a),'eq','1','logical or t'); 124 125cmp_ok(join('',1,2,(3,4,5)),'eq','12345','list ..(...)'); 126cmp_ok(join('',(1,2,3,4,5)),'eq','12345','list (.....)'); 127cmp_ok(join('',(1,2,3,4),5),'eq','12345','list (....).'); 128cmp_ok(join('',1,(2,3,4),5),'eq','12345','list .(...).'); 129cmp_ok(join('',1,2,(3,4),5),'eq','12345','list ..(..).'); 130cmp_ok(join('',1,2,3,(4),5),'eq','12345','list ...(.).'); 131cmp_ok(join('',(1,2),3,(4,5)),'eq','12345','list (..).(..)'); 132 133{ 134 my @a = (0, undef, undef, 3); 135 my @b = @a[1,2]; 136 my @c = (0, undef, undef, 3)[1, 2]; 137 cmp_ok(scalar(@b),'==',scalar(@c),'slice and slice'); 138 cmp_ok(scalar(@c),'==',2,'slice len'); 139 140 @b = (29, scalar @c[()]); 141 cmp_ok(join(':',@b),'eq','29:','slice ary nil'); 142 143 my %h = (a => 1); 144 @b = (30, scalar @h{()}); 145 cmp_ok(join(':',@b),'eq','30:','slice hash nil'); 146 147 my $size = scalar(()[1..1]); 148 cmp_ok($size,'==','0','size nil'); 149 150 $size = scalar(()=((1,2,3,4,5)[()])[2,3,4]); 151 is $size, 0, 'slice of empty list from complex expr is empty list'; 152 153 @a = (1)[2,3,4]; 154 is "@{[ map $_//'undef', @a ]}", "undef undef undef", 155 'slice beyond the end of non-empty list returns undefs'; 156} 157 158{ 159 # perl #39882 160 sub test_two_args { 161 my $test_name = shift; 162 is(scalar(@_), 2, $test_name); 163 } 164 test_two_args("simple list slice", (10,11)[2,3]); 165 test_two_args("grepped list slice", grep(1, (10,11)[2,3])); 166 test_two_args("sorted list slice", sort((10,11)[2,3])); 167 test_two_args("assigned list slice", my @tmp = (10,11)[2,3]); 168 test_two_args("do-returned list slice", do { (10,11)[2,3]; }); 169 test_two_args("list literal slice", qw(a b)[2,3]); 170 is (()=qw()[2,3], 0, "empty literal slice"); 171} 172 173{ 174 # perl #20321 175 is (join('', @{[('abc'=~/./g)[0,1,2,1,0]]}), "abcba"); 176} 177 178{ 179 is(join('', qw(a b c)[2,0,1]), "cab"); 180 my @a = qw(a b c); 181 is(join(":", @a), "a:b:c"); 182 my @b = qw(); 183 is($#b, -1); 184} 185 186{ 187 # comma operator with lvalue only propagates the lvalue context to 188 # the last operand. 189 ("const", my $x) ||= 1; 190 is( $x, 1 ); 191} 192 193# [perl #78194] list slice aliasing op return values 194sub { 195 is(\$_[0], \$_[1], 196 '[perl #78194] \$_[0] == \$_[1] when @_ aliases elems repeated by lslice' 197 ) 198} 199 ->(("${\''}")[0,0]); 200 201# [perl #122995] Hang when compiling while(1) in a sub-list 202# No ok() or is() necessary. 203sub foo { () = ($a, my $b, ($c, do { while(1) {} })) } 204 205# List assignment and OPpTARGET_MY 206{ 207 my ($a,$b); 208 my $foo = "foo"; 209 my $bar = "bar"; 210 ($a,$b) = ($b = $foo."", $a = $bar . ""); 211 is("$a,$b", "foo,bar", 'common vars check accounts for OPpTARGET_MY'); 212} 213 214sub TIESCALAR {bless{}} 215sub FETCH {$_[0]{fetched}++} 216sub empty {} 217tie $t, ""; 218() = (empty(), ($t)x10); # empty() since sub calls usually result in copies 219is(tied($t)->{fetched}, undef, 'assignment to empty list makes no copies'); 220 221# this was passing a trash SV at the top of the stack to SvIV() 222ok(($0[()[()]],1), "[perl #126193] list slice with zero indexes"); 223 224# RT #131732: pp_list must extend stack when empty-array arg and not in list 225# context 226{ 227 my @x; 228 @x; 229 pass('no panic'); # panics only under DEBUGGING 230} 231 232fresh_perl_is(<<'EOS', "", {}, "[perl #131954] heap use after free in pp_list"); 233#!./perl 234BEGIN { 235my $bar = "bar"; 236 237sub test_no_error { 238 eval $_[0]; 239} 240 241test_no_error($_) for split /\n/, 242q[ x 243 definfoo, $bar; 244 x 245 x 246 x 247 grep((not $bar, $bar, $bar), $bar); 248 x 249 x 250 x 251 x 252 x 253 x 254 x 255 x 256 x 257 x 258 x 259 x 260 x 261 x 262 x 263 x 264 x 265 x 266 x 267 x 268 ]; 269} 270EOS 271 272# this used to SEGV due to deep recursion in Perl_list() 273 274{ 275 my $e = "1"; $e = "(1,$e)" for 1..100_000; $e = "() = $e"; eval $e; 276 is $@, "", "SEGV in Perl_list"; 277} 278