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