1Check strict vars functionality 2 3__END__ 4 5# no strict, should build & run ok. 6Fred ; 7my $fred ; 8$b = "fred" ; 9$a = $$b ; 10EXPECT 11 12######## 13 14use strict qw(subs refs) ; 15$fred ; 16EXPECT 17 18######## 19 20use strict ; 21no strict 'vars' ; 22$fred ; 23EXPECT 24 25######## 26 27# strict vars - no error 28use strict 'vars' ; 29use vars qw( $freddy) ; 30BEGIN { *freddy = \$joe::shmoe; } 31$freddy = 2 ; 32EXPECT 33 34######## 35 36# strict vars - no error 37use strict 'vars' ; 38use vars qw( $freddy) ; 39local $abc::joe ; 40my $fred ; 41my $b = \$fred ; 42$Fred::ABC = 1 ; 43$freddy = 2 ; 44EXPECT 45 46######## 47 48# strict vars - error 49use strict ; 50$fred ; 51EXPECT 52Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4. 53Execution of - aborted due to compilation errors. 54######## 55 56# strict vars - error 57use strict 'vars' ; 58<$fred> ; 59EXPECT 60Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4. 61Execution of - aborted due to compilation errors. 62######## 63 64# strict vars - error 65use strict 'vars' ; 66local $fred ; 67EXPECT 68Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4. 69Execution of - aborted due to compilation errors. 70######## 71 72# Check compile time scope of strict vars pragma 73use strict 'vars' ; 74{ 75 no strict ; 76 $joe = 1 ; 77} 78$joe = 1 ; 79EXPECT 80Variable "$joe" is not imported at - line 8. 81Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. 82Execution of - aborted due to compilation errors. 83######## 84 85# Check compile time scope of strict vars pragma 86use strict 'vars' ; 87use utf8; 88use open qw( :utf8 :std ); 89{ 90 no strict ; 91 $jòè = 1 ; 92} 93$jòè = 1 ; 94EXPECT 95Variable "$jòè" is not imported at - line 10. 96Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at - line 10. 97Execution of - aborted due to compilation errors. 98######## 99 100# Check compile time scope of strict vars pragma 101no strict; 102{ 103 use strict 'vars' ; 104 $joe = 1 ; 105} 106$joe = 1 ; 107EXPECT 108Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6. 109Execution of - aborted due to compilation errors. 110######## 111 112--FILE-- abc 113$joe = 1 ; 1141; 115--FILE-- 116use strict 'vars' ; 117require "./abc"; 118EXPECT 119 120######## 121 122--FILE-- abc 123use strict 'vars' ; 1241; 125--FILE-- 126require "./abc"; 127$joe = 1 ; 128EXPECT 129 130######## 131 132--FILE-- abc 133use strict 'vars' ; 134$joe = 1 ; 1351; 136--FILE-- 137$joe = 1 ; 138require "./abc"; 139EXPECT 140Variable "$joe" is not imported at ./abc line 2. 141Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at ./abc line 2. 142Compilation failed in require at - line 2. 143######## 144 145--FILE-- abc 146use strict 'vars' ; 147use utf8; 148use open qw( :utf8 :std ); 149$jòè = 1 ; 1501; 151--FILE-- 152use utf8; 153use open qw( :utf8 :std ); 154$jòè = 1 ; 155require "./abc"; 156EXPECT 157Variable "$jòè" is not imported at ./abc line 4. 158Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at ./abc line 4. 159Compilation failed in require at - line 4. 160######## 161 162--FILE-- abc.pm 163use strict 'vars' ; 164$joe = 1 ; 1651; 166--FILE-- 167$joe = 1 ; 168use abc; 169EXPECT 170Variable "$joe" is not imported at abc.pm line 2. 171Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at abc.pm line 2. 172Compilation failed in require at - line 2. 173BEGIN failed--compilation aborted at - line 2. 174######## 175 176--FILE-- abc.pm 177use strict 'vars' ; 178use utf8; 179use open qw( :utf8 :std ); 180$jòè = 1 ; 1811; 182--FILE-- 183use utf8; 184use open qw( :utf8 :std ); 185$jòè = 1 ; 186use abc; 187EXPECT 188Variable "$jòè" is not imported at abc.pm line 4. 189Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at abc.pm line 4. 190Compilation failed in require at - line 4. 191BEGIN failed--compilation aborted at - line 4. 192######## 193 194--FILE-- abc.pm 195package Burp; 196use strict; 197$a = 1;$f = 1;$k = 1; # just to get beyond the limit... 198$b = 1;$g = 1;$l = 1; 199$c = 1;$h = 1;$m = 1; 200$d = 1;$i = 1;$n = 1; 201$e = 1;$j = 1;$o = 1; 202$p = 0b12; 203--FILE-- 204use abc; 205EXPECT 206Global symbol "$f" requires explicit package name (did you forget to declare "my $f"?) at abc.pm line 3. 207Global symbol "$k" requires explicit package name (did you forget to declare "my $k"?) at abc.pm line 3. 208Global symbol "$g" requires explicit package name (did you forget to declare "my $g"?) at abc.pm line 4. 209Global symbol "$l" requires explicit package name (did you forget to declare "my $l"?) at abc.pm line 4. 210Global symbol "$c" requires explicit package name (did you forget to declare "my $c"?) at abc.pm line 5. 211Global symbol "$h" requires explicit package name (did you forget to declare "my $h"?) at abc.pm line 5. 212Global symbol "$m" requires explicit package name (did you forget to declare "my $m"?) at abc.pm line 5. 213Global symbol "$d" requires explicit package name (did you forget to declare "my $d"?) at abc.pm line 6. 214Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at abc.pm line 6. 215Global symbol "$n" requires explicit package name (did you forget to declare "my $n"?) at abc.pm line 6. 216Global symbol "$e" requires explicit package name (did you forget to declare "my $e"?) at abc.pm line 7. 217Global symbol "$j" requires explicit package name (did you forget to declare "my $j"?) at abc.pm line 7. 218Global symbol "$o" requires explicit package name (did you forget to declare "my $o"?) at abc.pm line 7. 219Global symbol "$p" requires explicit package name (did you forget to declare "my $p"?) at abc.pm line 8. 220Illegal binary digit '2' at abc.pm line 8, at end of line 221abc.pm has too many errors. 222Compilation failed in require at - line 1. 223BEGIN failed--compilation aborted at - line 1. 224######## 225 226# Check scope of pragma with eval 227no strict ; 228eval { 229 $joe = 1 ; 230}; 231print STDERR $@; 232$joe = 1 ; 233EXPECT 234 235######## 236 237# Check scope of pragma with eval 238no strict ; 239eval { 240 use strict 'vars' ; 241 $joe = 1 ; 242}; 243print STDERR $@; 244$joe = 1 ; 245EXPECT 246Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6. 247Execution of - aborted due to compilation errors. 248######## 249 250# Check scope of pragma with eval 251use strict 'vars' ; 252eval { 253 $joe = 1 ; 254}; 255print STDERR $@; 256$joe = 1 ; 257EXPECT 258Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 5. 259Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. 260Execution of - aborted due to compilation errors. 261######## 262 263# Check scope of pragma with eval 264use strict 'vars' ; 265eval { 266 no strict ; 267 $joe = 1 ; 268}; 269print STDERR $@; 270$joe = 1 ; 271EXPECT 272Variable "$joe" is not imported at - line 9. 273Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 9. 274Execution of - aborted due to compilation errors. 275######## 276 277# Check scope of pragma with eval 278use strict 'vars' ; 279use utf8; 280use open qw( :utf8 :std ); 281eval { 282 no strict ; 283 $jòè = 1 ; 284}; 285print STDERR $@; 286$jòè = 1 ; 287EXPECT 288Variable "$jòè" is not imported at - line 11. 289Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at - line 11. 290Execution of - aborted due to compilation errors. 291######## 292 293# Check scope of pragma with eval 294no strict ; 295eval ' 296 $joe = 1 ; 297'; print STDERR $@ ; 298$joe = 1 ; 299EXPECT 300 301######## 302 303# Check scope of pragma with eval 304no strict ; 305eval q[ 306 use strict 'vars' ; 307 $joe = 1 ; 308]; print STDERR $@; 309EXPECT 310Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 3. 311######## 312 313# Check scope of pragma with eval 314use strict 'vars' ; 315eval ' 316 $joe = 1 ; 317'; print STDERR $@ ; 318EXPECT 319Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 2. 320######## 321 322# Check scope of pragma with eval 323use strict 'vars' ; 324eval ' 325 no strict ; 326 $joe = 1 ; 327'; print STDERR $@; 328$joe = 1 ; 329EXPECT 330Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. 331Execution of - aborted due to compilation errors. 332######## 333 334# Check if multiple evals produce same errors 335use strict 'vars'; 336my $ret = eval q{ print $x; }; 337print $@; 338print "ok 1\n" unless defined $ret; 339$ret = eval q{ print $x; }; 340print $@; 341print "ok 2\n" unless defined $ret; 342EXPECT 343Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 1) line 1. 344ok 1 345Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 2) line 1. 346ok 2 347######## 348 349# strict vars with outer our - no error 350use strict 'vars' ; 351our $freddy; 352local $abc::joe ; 353my $fred ; 354my $b = \$fred ; 355$Fred::ABC = 1 ; 356$freddy = 2 ; 357EXPECT 358 359######## 360 361# strict vars with inner our - no error 362use strict 'vars' ; 363sub foo { 364 our $fred; 365 $fred; 366} 367EXPECT 368 369######## 370 371# strict vars with outer our, inner use - no error 372use strict 'vars' ; 373our $fred; 374sub foo { 375 $fred; 376} 377EXPECT 378 379######## 380 381# strict vars with nested our - no error 382use strict 'vars' ; 383our $fred; 384sub foo { 385 our $fred; 386 $fred; 387} 388$fred ; 389EXPECT 390 391######## 392 393# strict vars with elapsed our - error 394use strict 'vars' ; 395sub foo { 396 our $fred; 397 $fred; 398} 399$fred ; 400EXPECT 401Variable "$fred" is not imported at - line 8. 402Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 8. 403Execution of - aborted due to compilation errors. 404######## 405 406# strict vars with elapsed our - error 407use strict 'vars' ; 408use utf8; 409use open qw( :utf8 :std ); 410sub fòò { 411 our $frèd; 412 $frèd; 413} 414$frèd ; 415EXPECT 416Variable "$frèd" is not imported at - line 10. 417Global symbol "$frèd" requires explicit package name (did you forget to declare "my $frèd"?) at - line 10. 418Execution of - aborted due to compilation errors. 419######## 420 421# nested our with local - no error 422$fred = 1; 423use strict 'vars'; 424{ 425 local our $fred = 2; 426 print $fred,"\n"; 427} 428print our $fred,"\n"; 429EXPECT 4302 4311 432######## 433 434# "nailed" our declaration visibility across package boundaries 435use strict 'vars'; 436our $foo; 437$foo = 20; 438package Foo; 439print $foo, "\n"; 440EXPECT 44120 442######## 443 444# multiple our declarations in same scope, different packages, no warning 445use strict 'vars'; 446use warnings; 447our $foo; 448${foo} = 10; 449package Foo; 450our $foo = 20; 451print $foo, "\n"; 452EXPECT 45320 454######## 455 456# multiple our declarations in same scope, same package, warning 457use strict 'vars'; 458use warnings; 459our $foo; 460${foo} = 10; 461our $foo; 462EXPECT 463"our" variable $foo redeclared at - line 7. 464######## 465 466# multiple our declarations in same scope, same package, warning 467use strict 'vars'; 468use warnings; 469{ our $x = 1 } 470{ our $x = 0 } 471our $foo; 472{ 473 our $foo; 474 our $foo; 475 package Foo; 476 our $foo; 477} 478EXPECT 479"our" variable $foo redeclared at - line 9. 480 (Did you mean "local" instead of "our"?) 481"our" variable $foo redeclared at - line 10. 482######## 483 484--FILE-- abc 485ok 486--FILE-- 487# check if our variables are introduced correctly in readline() 488package Foo; 489use strict 'vars'; 490our $FH; 491open $FH, "abc" or die "Can't open 'abc': $!"; 492print <$FH>; 493close $FH; 494EXPECT 495ok 496######## 497 498# Make sure the strict vars failure still occurs 499# now that the '@i should be written as \@i' failure does not occur 500# 20000522 mjd@plover.com (MJD) 501use strict 'vars'; 502no warnings; 503"@i_like_crackers"; 504EXPECT 505Global symbol "@i_like_crackers" requires explicit package name (did you forget to declare "my @i_like_crackers"?) at - line 7. 506Execution of - aborted due to compilation errors. 507######## 508 509# [perl #21914] New bug > 5.8.0. Used to dump core. 510use strict 'vars'; 511@k = <$k>; 512EXPECT 513Global symbol "@k" requires explicit package name (did you forget to declare "my @k"?) at - line 4. 514Global symbol "$k" requires explicit package name (did you forget to declare "my $k"?) at - line 4. 515Execution of - aborted due to compilation errors. 516######## 517# [perl #26910] hints not propagated into (?{...}) 518use strict 'vars'; 519qr/(?{$foo++})/; 520EXPECT 521Global symbol "$foo" requires explicit package name (did you forget to declare "my $foo"?) at - line 3. 522Execution of - aborted due to compilation errors. 523######## 524# Regex compilation errors weren't UTF-8 clean. 525use strict 'vars'; 526use utf8; 527use open qw( :utf8 :std ); 528qr/(?{$fòò++})/; 529EXPECT 530Global symbol "$fòò" requires explicit package name (did you forget to declare "my $fòò"?) at - line 5. 531Execution of - aborted due to compilation errors. 532######## 533# [perl #73712] 'Variable is not imported' should be suppressible 534$dweck; 535use strict 'vars'; 536no warnings; 537eval q/$dweck/; 538EXPECT 539######## 540# [perl #112316] strict vars getting confused by nulls 541# Assigning to a package whose name contains a null 542BEGIN { *Foo:: = *{"foo\0bar::"} } 543package foo; 544*Foo::bar = []; 545use strict; 546eval 'package Foo; @bar = 1' or die; 547EXPECT 548######## 549# [perl #112316] strict vars getting confused by nulls 550# Assigning from within a package whose name contains a null 551BEGIN { *Foo:: = *{"foo\0bar::"} } 552package Foo; 553*foo::bar = []; 554use strict; 555eval 'package foo; @bar = 1' or die; 556EXPECT 557######## 558# [perl #112316] strict vars getting confused by nulls 559# Assigning from one null package to another, with a common prefix 560BEGIN { *Foo:: = *{"foo\0foo::"}; 561 *Bar:: = *{"foo\0bar::"} } 562package Foo; 563*Bar::bar = []; 564use strict; 565eval 'package Bar; @bar = 1' or die; 566EXPECT 567######## 568# UTF8 and Latin1 package names equivalent at the byte level 569use utf8; 570# ĵ in UTF-8 is the same as ĵ in Latin-1 571package ĵ; 572*ĵ::bar = []; 573use strict; 574eval 'package ĵ; @bar = 1' or die; 575EXPECT 576