xref: /openbsd/gnu/usr.bin/perl/t/lib/strict/vars (revision d415bd75)
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