This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #121638] Make ‘Global symbol’ message more newbie-friendly
authorFather Chrysostomos <sprout@cpan.org>
Fri, 19 Sep 2014 03:34:43 +0000 (20:34 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Fri, 19 Sep 2014 04:30:48 +0000 (21:30 -0700)
by suggesting the declaration of a lexical variable, but without
removing the ‘Global symbol’ part, since much code no doubt depends
on its presence.

ext/B/t/optree_concise.t
gv.c
t/lib/strict/subs
t/lib/strict/vars
t/run/runenv.t
t/run/switchM.t
t/win32/runenv.t

index aa28ebb..f9a2729 100644 (file)
@@ -264,7 +264,7 @@ checkOptree
     ( name     => 'cmdline self-strict compile err using prog',
       prog     => 'use strict; sort @a',
       bcopts   => [qw/ -basic -concise -exec /],
-      errs     => 'Global symbol "@a" requires explicit package name at -e line 1.',
+      errs     => 'Global symbol "@a" requires explicit package name (did you forget to declare "my @a"?) at -e line 1.',
       expect   => 'nextstate',
       expect_nt        => 'nextstate',
       noanchors => 1, # allow simple expectations to work
@@ -274,7 +274,9 @@ checkOptree
     ( name     => 'cmdline self-strict compile err using code',
       code     => 'use strict; sort @a',
       bcopts   => [qw/ -basic -concise -exec /],
-      errs     => qr/Global symbol "\@a" requires explicit package name at .*? line 1\./,
+      errs     => qr/Global symbol "\@a" requires explicit package (?x:
+                    )name \(did you forget to declare "my \@a"\?\) at (?x:
+                    ).*? line 1\./,
       note     => 'this test relys on a kludge which copies $@ to rendering when empty',
       expect   => 'Global symbol',
       expect_nt        => 'Global symbol',
diff --git a/gv.c b/gv.c
index b61b21c..4930c03 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1733,7 +1733,12 @@ S_find_default_stash(pTHX_ HV **stash, const char *name, STRLEN len,
         if (add && !PL_in_clean_all) {
             SV * const err = Perl_mess(aTHX_
                  "Global symbol \"%s%"UTF8f
-                 "\" requires explicit package name",
+                 "\" requires explicit package name (did you forget to "
+                 "declare \"my %s%"UTF8f"\"?)",
+                 (sv_type == SVt_PV ? "$"
+                  : sv_type == SVt_PVAV ? "@"
+                  : sv_type == SVt_PVHV ? "%"
+                  : ""), UTF8fARG(is_utf8, len, name),
                  (sv_type == SVt_PV ? "$"
                   : sv_type == SVt_PVAV ? "@"
                   : sv_type == SVt_PVHV ? "%"
index 5fd0b03..095adee 100644 (file)
@@ -108,7 +108,7 @@ use strict 'vars' ;
 $joe = 1 ;
 EXPECT
 Variable "$joe" is not imported at - line 8.
-Global symbol "$joe" requires explicit package name at - line 8.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -120,7 +120,7 @@ no strict;
 }
 $joe = 1 ;
 EXPECT
-Global symbol "$joe" requires explicit package name at - line 6.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6.
 Execution of - aborted due to compilation errors.
 ########
 
index c6cb067..b571751 100644 (file)
@@ -49,7 +49,7 @@ EXPECT
 use strict ;
 $fred ;
 EXPECT
-Global symbol "$fred" requires explicit package name at - line 4.
+Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -57,7 +57,7 @@ Execution of - aborted due to compilation errors.
 use strict 'vars' ;
 <$fred> ;
 EXPECT
-Global symbol "$fred" requires explicit package name at - line 4.
+Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -65,7 +65,7 @@ Execution of - aborted due to compilation errors.
 use strict 'vars' ;
 local $fred ;
 EXPECT
-Global symbol "$fred" requires explicit package name at - line 4.
+Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 4.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -78,7 +78,7 @@ use strict 'vars' ;
 $joe = 1 ;
 EXPECT
 Variable "$joe" is not imported at - line 8.
-Global symbol "$joe" requires explicit package name at - line 8.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -93,7 +93,7 @@ use open qw( :utf8 :std );
 $jòè = 1 ;
 EXPECT
 Variable "$jòè" is not imported at - line 10.
-Global symbol "$jòè" requires explicit package name at - line 10.
+Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at - line 10.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -105,7 +105,7 @@ no strict;
 }
 $joe = 1 ;
 EXPECT
-Global symbol "$joe" requires explicit package name at - line 6.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -138,7 +138,7 @@ $joe = 1 ;
 require "./abc";
 EXPECT
 Variable "$joe" is not imported at ./abc line 2.
-Global symbol "$joe" requires explicit package name at ./abc line 2.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at ./abc line 2.
 Compilation failed in require at - line 2.
 ########
 
@@ -155,7 +155,7 @@ $jòè = 1 ;
 require "./abc";
 EXPECT
 Variable "$jòè" is not imported at ./abc line 4.
-Global symbol "$jòè" requires explicit package name at ./abc line 4.
+Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at ./abc line 4.
 Compilation failed in require at - line 4.
 ########
 
@@ -168,7 +168,7 @@ $joe = 1 ;
 use abc;
 EXPECT
 Variable "$joe" is not imported at abc.pm line 2.
-Global symbol "$joe" requires explicit package name at abc.pm line 2.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at abc.pm line 2.
 Compilation failed in require at - line 2.
 BEGIN failed--compilation aborted at - line 2.
 ########
@@ -186,7 +186,7 @@ $jòè = 1 ;
 use abc;
 EXPECT
 Variable "$jòè" is not imported at abc.pm line 4.
-Global symbol "$jòè" requires explicit package name at abc.pm line 4.
+Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at abc.pm line 4.
 Compilation failed in require at - line 4.
 BEGIN failed--compilation aborted at - line 4.
 ########
@@ -203,20 +203,20 @@ $p = 0b12;
 --FILE-- 
 use abc;
 EXPECT
-Global symbol "$f" requires explicit package name at abc.pm line 3.
-Global symbol "$k" requires explicit package name at abc.pm line 3.
-Global symbol "$g" requires explicit package name at abc.pm line 4.
-Global symbol "$l" requires explicit package name at abc.pm line 4.
-Global symbol "$c" requires explicit package name at abc.pm line 5.
-Global symbol "$h" requires explicit package name at abc.pm line 5.
-Global symbol "$m" requires explicit package name at abc.pm line 5.
-Global symbol "$d" requires explicit package name at abc.pm line 6.
-Global symbol "$i" requires explicit package name at abc.pm line 6.
-Global symbol "$n" requires explicit package name at abc.pm line 6.
-Global symbol "$e" requires explicit package name at abc.pm line 7.
-Global symbol "$j" requires explicit package name at abc.pm line 7.
-Global symbol "$o" requires explicit package name at abc.pm line 7.
-Global symbol "$p" requires explicit package name at abc.pm line 8.
+Global symbol "$f" requires explicit package name (did you forget to declare "my $f"?) at abc.pm line 3.
+Global symbol "$k" requires explicit package name (did you forget to declare "my $k"?) at abc.pm line 3.
+Global symbol "$g" requires explicit package name (did you forget to declare "my $g"?) at abc.pm line 4.
+Global symbol "$l" requires explicit package name (did you forget to declare "my $l"?) at abc.pm line 4.
+Global symbol "$c" requires explicit package name (did you forget to declare "my $c"?) at abc.pm line 5.
+Global symbol "$h" requires explicit package name (did you forget to declare "my $h"?) at abc.pm line 5.
+Global symbol "$m" requires explicit package name (did you forget to declare "my $m"?) at abc.pm line 5.
+Global symbol "$d" requires explicit package name (did you forget to declare "my $d"?) at abc.pm line 6.
+Global symbol "$i" requires explicit package name (did you forget to declare "my $i"?) at abc.pm line 6.
+Global symbol "$n" requires explicit package name (did you forget to declare "my $n"?) at abc.pm line 6.
+Global symbol "$e" requires explicit package name (did you forget to declare "my $e"?) at abc.pm line 7.
+Global symbol "$j" requires explicit package name (did you forget to declare "my $j"?) at abc.pm line 7.
+Global symbol "$o" requires explicit package name (did you forget to declare "my $o"?) at abc.pm line 7.
+Global symbol "$p" requires explicit package name (did you forget to declare "my $p"?) at abc.pm line 8.
 Illegal binary digit '2' at abc.pm line 8, at end of line
 abc.pm has too many errors.
 Compilation failed in require at - line 1.
@@ -243,7 +243,7 @@ eval {
 print STDERR $@;
 $joe = 1 ;
 EXPECT
-Global symbol "$joe" requires explicit package name at - line 6.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 6.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -255,8 +255,8 @@ eval {
 print STDERR $@;
 $joe = 1 ;
 EXPECT
-Global symbol "$joe" requires explicit package name at - line 5.
-Global symbol "$joe" requires explicit package name at - line 8.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 5.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -270,7 +270,7 @@ print STDERR $@;
 $joe = 1 ;
 EXPECT
 Variable "$joe" is not imported at - line 9.
-Global symbol "$joe" requires explicit package name at - line 9.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 9.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -286,7 +286,7 @@ print STDERR $@;
 $jòè = 1 ;
 EXPECT
 Variable "$jòè" is not imported at - line 11.
-Global symbol "$jòè" requires explicit package name at - line 11.
+Global symbol "$jòè" requires explicit package name (did you forget to declare "my $jòè"?) at - line 11.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -307,7 +307,7 @@ eval q[
     $joe = 1 ;
 ]; print STDERR $@;
 EXPECT
-Global symbol "$joe" requires explicit package name at (eval 1) line 3.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 3.
 ########
 
 # Check scope of pragma with eval
@@ -316,7 +316,7 @@ eval '
     $joe = 1 ;
 '; print STDERR $@ ;
 EXPECT
-Global symbol "$joe" requires explicit package name at (eval 1) line 2.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at (eval 1) line 2.
 ########
 
 # Check scope of pragma with eval
@@ -327,7 +327,7 @@ eval '
 '; print STDERR $@;
 $joe = 1 ;
 EXPECT
-Global symbol "$joe" requires explicit package name at - line 8.
+Global symbol "$joe" requires explicit package name (did you forget to declare "my $joe"?) at - line 8.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -340,9 +340,9 @@ $ret = eval q{ print $x; };
 print $@;
 print "ok 2\n" unless defined $ret;
 EXPECT
-Global symbol "$x" requires explicit package name at (eval 1) line 1.
+Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 1) line 1.
 ok 1
-Global symbol "$x" requires explicit package name at (eval 2) line 1.
+Global symbol "$x" requires explicit package name (did you forget to declare "my $x"?) at (eval 2) line 1.
 ok 2
 ########
 
@@ -399,7 +399,7 @@ sub foo {
 $fred ;
 EXPECT
 Variable "$fred" is not imported at - line 8.
-Global symbol "$fred" requires explicit package name at - line 8.
+Global symbol "$fred" requires explicit package name (did you forget to declare "my $fred"?) at - line 8.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -414,7 +414,7 @@ sub fòò {
 $frèd ;
 EXPECT
 Variable "$frèd" is not imported at - line 10.
-Global symbol "$frèd" requires explicit package name at - line 10.
+Global symbol "$frèd" requires explicit package name (did you forget to declare "my $frèd"?) at - line 10.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -502,7 +502,7 @@ use strict 'vars';
 no warnings;
 "@i_like_crackers";
 EXPECT
-Global symbol "@i_like_crackers" requires explicit package name at - line 7.
+Global symbol "@i_like_crackers" requires explicit package name (did you forget to declare "my @i_like_crackers"?) at - line 7.
 Execution of - aborted due to compilation errors.
 ########
 
@@ -510,15 +510,15 @@ Execution of - aborted due to compilation errors.
 use strict 'vars';
 @k = <$k>;
 EXPECT
-Global symbol "@k" requires explicit package name at - line 4.
-Global symbol "$k" requires explicit package name at - line 4.
+Global symbol "@k" requires explicit package name (did you forget to declare "my @k"?) at - line 4.
+Global symbol "$k" requires explicit package name (did you forget to declare "my $k"?) at - line 4.
 Execution of - aborted due to compilation errors.
 ########
 # [perl #26910] hints not propagated into (?{...})
 use strict 'vars';
 qr/(?{$foo++})/;
 EXPECT
-Global symbol "$foo" requires explicit package name at - line 3.
+Global symbol "$foo" requires explicit package name (did you forget to declare "my $foo"?) at - line 3.
 Execution of - aborted due to compilation errors.
 ########
 # Regex compilation errors weren't UTF-8 clean.
@@ -527,7 +527,7 @@ use utf8;
 use open qw( :utf8 :std );
 qr/(?{$fòò++})/;
 EXPECT
-Global symbol "$fòò" requires explicit package name at - line 5.
+Global symbol "$fòò" requires explicit package name (did you forget to declare "my $fòò"?) at - line 5.
 Execution of - aborted due to compilation errors.
 ########
 # [perl #73712] 'Variable is not imported' should be suppressible
index 9380d24..82846a4 100644 (file)
@@ -99,12 +99,12 @@ try({PERL5OPT => '-Mstrict'}, ['-I../lib', '-e', 'print $::x'],
 
 try({PERL5OPT => '-Mstrict'}, ['-I../lib', '-e', 'print $x'],
     "", 
-    qq{Global symbol "\$x" requires explicit package name at -e line 1.\nExecution of -e aborted due to compilation errors.\n});
+    qq{Global symbol "\$x" requires explicit package name (did you forget to declare "my \$x"?) at -e line 1.\nExecution of -e aborted due to compilation errors.\n});
 
 # Fails in 5.6.0
 try({PERL5OPT => '-Mstrict -w'}, ['-I../lib', '-e', 'print $x'],
     "", 
-    qq{Global symbol "\$x" requires explicit package name at -e line 1.\nExecution of -e aborted due to compilation errors.\n});
+    qq{Global symbol "\$x" requires explicit package name (did you forget to declare "my \$x"?) at -e line 1.\nExecution of -e aborted due to compilation errors.\n});
 
 # Fails in 5.6.0
 try({PERL5OPT => '-w -Mstrict'}, ['-I../lib', '-e', 'print $::x'],
index d2b5994..603d5c5 100644 (file)
@@ -14,11 +14,13 @@ require './test.pl';
 plan(4);
 
 like(runperl(switches => ['-Irun/flib', '-Mbroken'], stderr => 1),
-     qr/^Global symbol "\$x" requires explicit package name at run\/flib\/broken.pm line 6\./,
+     qr/^Global symbol "\$x" requires explicit package name \(did you (?x:
+        )forget to declare "my \$x"\?\) at run\/flib\/broken.pm line 6\./,
      "Ensure -Irun/flib produces correct filename in warnings");
 
 like(runperl(switches => ['-Irun/flib/', '-Mbroken'], stderr => 1),
-     qr/^Global symbol "\$x" requires explicit package name at run\/flib\/broken.pm line 6\./,
+     qr/^Global symbol "\$x" requires explicit package name \(did you (?x:
+        )forget to declare "my \$x"\?\) at run\/flib\/broken.pm line 6\./,
      "Ensure -Irun/flib/ produces correct filename in warnings");
 
 SKIP: {
index d487ea7..0e2b0ca 100644 (file)
@@ -96,12 +96,12 @@ try({PERL5OPT => '-Mstrict'}, ['-I..\lib', '-e', '"print $::x"'],
 
 try({PERL5OPT => '-Mstrict'}, ['-I..\lib', '-e', '"print $x"'],
     "", 
-    qq(Global symbol "\$x" requires explicit package name at -e line 1.${NL}Execution of -e aborted due to compilation errors.${NL}));
+    qq(Global symbol "\$x" requires explicit package name (did you forget to declare "my \$x"?) at -e line 1.${NL}Execution of -e aborted due to compilation errors.${NL}));
 
 # Fails in 5.6.0
 try({PERL5OPT => '-Mstrict -w'}, ['-I..\lib', '-e', '"print $x"'],
     "", 
-    qq(Global symbol "\$x" requires explicit package name at -e line 1.${NL}Execution of -e aborted due to compilation errors.${NL}));
+    qq(Global symbol "\$x" requires explicit package name (did you forget to declare "my \$x"?) at -e line 1.${NL}Execution of -e aborted due to compilation errors.${NL}));
 
 # Fails in 5.6.0
 try({PERL5OPT => '-w -Mstrict'}, ['-I..\lib', '-e', '"print $::x"'],