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. 216abc.pm has too many errors. 217Compilation failed in require at - line 1. 218BEGIN failed--compilation aborted at - line 1. 219######## 220 221# Check scope of pragma with eval 222no strict ; 223eval { 224 $joe = 1 ; 225}; 226print STDERR $@; 227$joe = 1 ; 228EXPECT 229 230######## 231 232# Check scope of pragma with eval 233no strict ; 234eval { 235 use strict 'vars' ; 236 $joe = 1 ; 237}; 238print STDERR $@; 239$joe = 1 ; 240EXPECT 241Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6. 242Execution of - aborted due to compilation errors. 243######## 244 245# Check scope of pragma with eval 246use strict 'vars' ; 247eval { 248 $joe = 1 ; 249}; 250print STDERR $@; 251$joe = 1 ; 252EXPECT 253Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 5. 254Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. 255Execution of - aborted due to compilation errors. 256######## 257 258# Check scope of pragma with eval 259use strict 'vars' ; 260eval { 261 no strict ; 262 $joe = 1 ; 263}; 264print STDERR $@; 265$joe = 1 ; 266EXPECT 267Variable "$joe" is not imported at - line 9. 268Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 9. 269Execution of - aborted due to compilation errors. 270######## 271 272# Check scope of pragma with eval 273use strict 'vars' ; 274use utf8; 275use open qw( :utf8 :std ); 276eval { 277 no strict ; 278 $jòè = 1 ; 279}; 280print STDERR $@; 281$jòè = 1 ; 282EXPECT 283Variable "$jòè" is not imported at - line 11. 284Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at - line 11. 285Execution of - aborted due to compilation errors. 286######## 287 288# Check scope of pragma with eval 289no strict ; 290eval ' 291 $joe = 1 ; 292'; print STDERR $@ ; 293$joe = 1 ; 294EXPECT 295 296######## 297 298# Check scope of pragma with eval 299no strict ; 300eval q[ 301 use strict 'vars' ; 302 $joe = 1 ; 303]; print STDERR $@; 304EXPECT 305Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 3. 306######## 307 308# Check scope of pragma with eval 309use strict 'vars' ; 310eval ' 311 $joe = 1 ; 312'; print STDERR $@ ; 313EXPECT 314Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 2. 315######## 316 317# Check scope of pragma with eval 318use strict 'vars' ; 319eval ' 320 no strict ; 321 $joe = 1 ; 322'; print STDERR $@; 323$joe = 1 ; 324EXPECT 325Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8. 326Execution of - aborted due to compilation errors. 327######## 328 329# Check if multiple evals produce same errors 330use strict 'vars'; 331my $ret = eval q{ print $x; }; 332print $@; 333print "ok 1\n" unless defined $ret; 334$ret = eval q{ print $x; }; 335print $@; 336print "ok 2\n" unless defined $ret; 337EXPECT 338Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 1) line 1. 339ok 1 340Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 2) line 1. 341ok 2 342######## 343 344# strict vars with outer our - no error 345use strict 'vars' ; 346our $freddy; 347local $abc::joe ; 348my $fred ; 349my $b = \$fred ; 350$Fred::ABC = 1 ; 351$freddy = 2 ; 352EXPECT 353 354######## 355 356# strict vars with inner our - no error 357use strict 'vars' ; 358sub foo { 359 our $fred; 360 $fred; 361} 362EXPECT 363 364######## 365 366# strict vars with outer our, inner use - no error 367use strict 'vars' ; 368our $fred; 369sub foo { 370 $fred; 371} 372EXPECT 373 374######## 375 376# strict vars with nested our - no error 377use strict 'vars' ; 378our $fred; 379sub foo { 380 our $fred; 381 $fred; 382} 383$fred ; 384EXPECT 385 386######## 387 388# strict vars with elapsed our - error 389use strict 'vars' ; 390sub foo { 391 our $fred; 392 $fred; 393} 394$fred ; 395EXPECT 396Variable "$fred" is not imported at - line 8. 397Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 8. 398Execution of - aborted due to compilation errors. 399######## 400 401# strict vars with elapsed our - error 402use strict 'vars' ; 403use utf8; 404use open qw( :utf8 :std ); 405sub fòò { 406 our $frèd; 407 $frèd; 408} 409$frèd ; 410EXPECT 411Variable "$frèd" is not imported at - line 10. 412Global symbol "$frèd" requires explicit package name (did you forget to declare "my $frèd"?) at - line 10. 413Execution of - aborted due to compilation errors. 414######## 415 416# nested our with local - no error 417$fred = 1; 418use strict 'vars'; 419{ 420 local our $fred = 2; 421 print $fred,"\n"; 422} 423print our $fred,"\n"; 424EXPECT 4252 4261 427######## 428 429# "nailed" our declaration visibility across package boundaries 430use strict 'vars'; 431our $foo; 432$foo = 20; 433package Foo; 434print $foo, "\n"; 435EXPECT 43620 437######## 438 439# multiple our declarations in same scope, different packages, no warning 440use strict 'vars'; 441use warnings; 442our $foo; 443${foo} = 10; 444package Foo; 445our $foo = 20; 446print $foo, "\n"; 447EXPECT 44820 449######## 450 451# multiple our declarations in same scope, same package, warning 452use strict 'vars'; 453use warnings; 454our $foo; 455${foo} = 10; 456our $foo; 457EXPECT 458"our" variable $foo redeclared at - line 7. 459######## 460 461# multiple our declarations in same scope, same package, warning 462use strict 'vars'; 463use warnings; 464{ our $x = 1 } 465{ our $x = 0 } 466our $foo; 467{ 468 our $foo; 469 our $foo; 470 package Foo; 471 our $foo; 472} 473EXPECT 474"our" variable $foo redeclared at - line 9. 475 (Did you mean "local" instead of "our"?) 476"our" variable $foo redeclared at - line 10. 477######## 478 479--FILE-- abc 480ok 481--FILE-- 482# check if our variables are introduced correctly in readline() 483package Foo; 484use strict 'vars'; 485our $FH; 486open $FH, "abc" or die "Can't open 'abc': $!"; 487print <$FH>; 488close $FH; 489EXPECT 490ok 491######## 492 493# Make sure the strict vars failure still occurs 494# now that the '@i should be written as \@i' failure does not occur 495# 20000522 mjd@plover.com (MJD) 496use strict 'vars'; 497no warnings; 498"@i_like_crackers"; 499EXPECT 500Global symbol "@i_like_crackers" requires explicit package name (did you forget to declare "my @i_like_crackers"?) at - line 7. 501Execution of - aborted due to compilation errors. 502######## 503 504# [perl #21914] New bug > 5.8.0. Used to dump core. 505use strict 'vars'; 506@k = <$k>; 507EXPECT 508Global symbol "@k" requires explicit package name (did you forget to declare "my @k"?) at - line 4. 509Global symbol "$k" requires explicit package name (did you forget to declare "my $k"?) at - line 4. 510Execution of - aborted due to compilation errors. 511######## 512# [perl #26910] hints not propagated into (?{...}) 513use strict 'vars'; 514qr/(?{$foo++})/; 515EXPECT 516Global symbol "$foo" requires explicit package name (did you forget to declare "my $foo"?) at - line 3. 517Execution of - aborted due to compilation errors. 518######## 519# Regex compilation errors weren't UTF-8 clean. 520use strict 'vars'; 521use utf8; 522use open qw( :utf8 :std ); 523qr/(?{$fòò++})/; 524EXPECT 525Global symbol "$fòò" requires explicit package name (did you forget to declare "my $fòò"?) at - line 5. 526Execution of - aborted due to compilation errors. 527######## 528# [perl #73712] 'Variable is not imported' should be suppressible 529$dweck; 530use strict 'vars'; 531no warnings; 532eval q/$dweck/; 533EXPECT 534######## 535# [perl #112316] strict vars getting confused by nulls 536# Assigning to a package whose name contains a null 537BEGIN { *Foo:: = *{"foo\0bar::"} } 538package foo; 539*Foo::bar = []; 540use strict; 541eval 'package Foo; @bar = 1' or die; 542EXPECT 543######## 544# [perl #112316] strict vars getting confused by nulls 545# Assigning from within a package whose name contains a null 546BEGIN { *Foo:: = *{"foo\0bar::"} } 547package Foo; 548*foo::bar = []; 549use strict; 550eval 'package foo; @bar = 1' or die; 551EXPECT 552######## 553# [perl #112316] strict vars getting confused by nulls 554# Assigning from one null package to another, with a common prefix 555BEGIN { *Foo:: = *{"foo\0foo::"}; 556 *Bar:: = *{"foo\0bar::"} } 557package Foo; 558*Bar::bar = []; 559use strict; 560eval 'package Bar; @bar = 1' or die; 561EXPECT 562######## 563# UTF8 and Latin1 package names equivalent at the byte level 564use utf8; 565# ĵ in UTF-8 is the same as ĵ in Latin-1 566package ĵ; 567*ĵ::bar = []; 568use strict; 569eval 'package ĵ; @bar = 1' or die; 570EXPECT 571