1#!./perl 2 3## 4## Many of these tests are originally from Michael Schroeder 5## <Michael.Schroeder@informatik.uni-erlangen.de> 6## Adapted and expanded by Gurusamy Sarathy <gsar@activestate.com> 7## 8 9chdir 't' if -d 't'; 10require './test.pl'; 11set_up_inc('../lib'); 12 13$|=1; 14 15run_multiple_progs('', \*DATA); 16 17done_testing(); 18 19__END__ 20@a = (1, 2, 3); 21{ 22 @a = sort { last ; } @a; 23} 24EXPECT 25Can't "last" outside a loop block at - line 3. 26######## 27package TEST; 28 29sub TIESCALAR { 30 my $foo; 31 return bless \$foo; 32} 33sub FETCH { 34 eval 'die("test")'; 35 print "still in fetch\n"; 36 return ">$@<"; 37} 38package main; 39 40tie $bar, TEST; 41print "- $bar\n"; 42EXPECT 43still in fetch 44- >test at (eval 1) line 1. 45< 46######## 47package TEST; 48 49sub TIESCALAR { 50 my $foo; 51 eval('die("foo\n")'); 52 print "after eval\n"; 53 return bless \$foo; 54} 55sub FETCH { 56 return "ZZZ"; 57} 58 59package main; 60 61tie $bar, TEST; 62print "- $bar\n"; 63print "OK\n"; 64EXPECT 65after eval 66- ZZZ 67OK 68######## 69package TEST; 70 71sub TIEHANDLE { 72 my $foo; 73 return bless \$foo; 74} 75sub PRINT { 76print STDERR "PRINT CALLED\n"; 77(split(/./, 'x'x10000))[0]; 78eval('die("test\n")'); 79} 80 81package main; 82 83open FH, ">&STDOUT"; 84tie *FH, TEST; 85print FH "OK\n"; 86print STDERR "DONE\n"; 87EXPECT 88PRINT CALLED 89DONE 90######## 91sub warnhook { 92 print "WARNHOOK\n"; 93 eval('die("foooo\n")'); 94} 95$SIG{'__WARN__'} = 'warnhook'; 96warn("dfsds\n"); 97print "END\n"; 98EXPECT 99WARNHOOK 100END 101######## 102package TEST; 103 104use overload 105 "\"\"" => \&str 106; 107 108sub str { 109 eval('die("test\n")'); 110 return "STR"; 111} 112 113package main; 114 115$bar = bless {}, TEST; 116print "$bar\n"; 117print "OK\n"; 118EXPECT 119STR 120OK 121######## 122sub foo { 123 $a <=> $b unless eval('$a == 0 ? bless undef : ($a <=> $b)'); 124} 125@a = (3, 2, 0, 1); 126@a = sort foo @a; 127print join(', ', @a)."\n"; 128EXPECT 1290, 1, 2, 3 130######## 131sub foo { 132 goto bar if $a == 0 || $b == 0; 133 $a <=> $b; 134} 135@a = (3, 2, 0, 1); 136@a = sort foo @a; 137print join(', ', @a)."\n"; 138exit; 139bar: 140print "bar reached\n"; 141EXPECT 142Can't "goto" out of a pseudo block at - line 2. 143######## 144%seen = (); 145sub sortfn { 146 (split(/./, 'x'x10000))[0]; 147 my (@y) = ( 4, 6, 5); 148 @y = sort { $a <=> $b } @y; 149 my $t = "sortfn ".join(', ', @y)."\n"; 150 print $t if ($seen{$t}++ == 0); 151 return $_[0] <=> $_[1]; 152} 153@x = ( 3, 2, 1 ); 154@x = sort { &sortfn($a, $b) } @x; 155print "---- ".join(', ', @x)."\n"; 156EXPECT 157sortfn 4, 5, 6 158---- 1, 2, 3 159######## 160@a = (3, 2, 1); 161@a = sort { eval('die("no way")') , $a <=> $b} @a; 162print join(", ", @a)."\n"; 163EXPECT 1641, 2, 3 165######## 166@a = (1, 2, 3); 167foo: 168{ 169 @a = sort { last foo; } @a; 170} 171EXPECT 172Label not found for "last foo" at - line 4. 173######## 174package TEST; 175 176sub TIESCALAR { 177 my $foo; 178 return bless \$foo; 179} 180sub FETCH { 181 next; 182 return "ZZZ"; 183} 184sub STORE { 185} 186 187package main; 188 189tie $bar, TEST; 190{ 191 print "- $bar\n"; 192} 193print "OK\n"; 194EXPECT 195Can't "next" outside a loop block at - line 8. 196######## 197package TEST; 198 199sub TIESCALAR { 200 my $foo; 201 return bless \$foo; 202} 203sub FETCH { 204 goto bbb; 205 return "ZZZ"; 206} 207 208package main; 209 210tie $bar, TEST; 211print "- $bar\n"; 212exit; 213bbb: 214print "bbb\n"; 215EXPECT 216Can't find label bbb at - line 8. 217######## 218sub foo { 219 $a <=> $b unless eval('$a == 0 ? die("foo\n") : ($a <=> $b)'); 220} 221@a = (3, 2, 0, 1); 222@a = sort foo @a; 223print join(', ', @a)."\n"; 224EXPECT 2250, 1, 2, 3 226######## 227package TEST; 228sub TIESCALAR { 229 my $foo; 230 return bless \$foo; 231} 232sub FETCH { 233 return "fetch"; 234} 235sub STORE { 236(split(/./, 'x'x10000))[0]; 237} 238package main; 239tie $bar, TEST; 240$bar = "x"; 241######## 242package TEST; 243sub TIESCALAR { 244 my $foo; 245 next; 246 return bless \$foo; 247} 248package main; 249{ 250tie $bar, TEST; 251} 252EXPECT 253Can't "next" outside a loop block at - line 4. 254######## 255@a = (1, 2, 3); 256foo: 257{ 258 @a = sort { exit(0) } @a; 259} 260END { print "foobar\n" } 261EXPECT 262foobar 263######## 264$SIG{__DIE__} = sub { 265 print "In DIE\n"; 266 $i = 0; 267 while (($p,$f,$l,$s) = caller(++$i)) { 268 print "$p|$f|$l|$s\n"; 269 } 270}; 271eval { die }; 272&{sub { eval 'die' }}(); 273sub foo { eval { die } } foo(); 274{package rmb; sub{ eval{die} } ->() }; # check __ANON__ knows package 275EXPECT 276In DIE 277main|-|8|(eval) 278In DIE 279main|-|9|(eval) 280main|-|9|main::__ANON__ 281In DIE 282main|-|10|(eval) 283main|-|10|main::foo 284In DIE 285rmb|-|11|(eval) 286rmb|-|11|rmb::__ANON__ 287######## 288package TEST; 289 290sub TIEARRAY { 291 return bless [qw(foo fee fie foe)], $_[0]; 292} 293sub FETCH { 294 my ($s,$i) = @_; 295 if ($i) { 296 goto bbb; 297 } 298bbb: 299 return $s->[$i]; 300} 301 302package main; 303tie my @bar, 'TEST'; 304print join('|', @bar[0..3]), "\n"; 305EXPECT 306foo|fee|fie|foe 307######## 308package TH; 309sub TIEHASH { bless {}, TH } 310sub STORE { eval { print "@_[1,2]\n" }; die "bar\n" } 311tie %h, TH; 312eval { $h{A} = 1; print "never\n"; }; 313print $@; 314eval { $h{B} = 2; }; 315print $@; 316EXPECT 317A 1 318bar 319B 2 320bar 321######## 322sub n { 0 } 323sub f { my $x = shift; d(); } 324f(n()); 325f(); 326 327sub d { 328 my $i = 0; my @a; 329 while (do { { package DB; @a = caller($i++) } } ) { 330 @a = @DB::args; 331 for (@a) { print "$_\n"; $_ = '' } 332 } 333} 334EXPECT 3350 336######## 337sub TIEHANDLE { bless {} } 338sub PRINT { next } 339 340tie *STDERR, ''; 341{ map ++$_, 1 } 342 343EXPECT 344Can't "next" outside a loop block at - line 2. 345######## 346sub TIEHANDLE { bless {} } 347sub PRINT { print "[TIE] $_[1]" } 348 349tie *STDERR, ''; 350die "DIE\n"; 351 352EXPECT 353[TIE] DIE 354######## 355sub TIEHANDLE { bless {} } 356sub PRINT { 357 (split(/./, 'x'x10000))[0]; 358 eval('die("test\n")'); 359 warn "[TIE] $_[1]"; 360} 361open OLDERR, '>&STDERR'; 362tie *STDERR, ''; 363 364use warnings FATAL => qw(uninitialized); 365print undef; 366 367EXPECT 368[TIE] Use of uninitialized value in print at - line 11. 369