RE: 5.6.0 BUG: Lexical warnings aren't lexical
Paul Marquess [Sun, 25 Mar 2001 21:59:15 +0000 (22:59 +0100)]
Message-ID: <000701c0b56e$73944220$07bdfea9@bfs.phone.com>

A variable will be checked for the "use once" warnings if:

1. It is in the scope of a use warnings 'once'
2. It isn't in the scope of the warnings pragma at all AND $^W is set.

Otherwise it won't be checked at all.

Part 1 is what is in perl >= 5.6.0, Part 2 is what I'm fixing.

The enclosed patch partially fixes this issue. What I didn't
get to work was the case where the "used once" warning is enabled
in any file other than the main file.

p4raw-id: //depot/perl@9401

gv.c
t/pragma/warn/perl

diff --git a/gv.c b/gv.c
index 72fcf82..2d43338 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -731,7 +731,8 @@ Perl_gv_fetchpv(pTHX_ const char *nambeg, I32 add, I32 sv_type)
     gv_init(gv, stash, name, len, add & GV_ADDMULTI);
     gv_init_sv(gv, sv_type);
 
-    if (isLEXWARN_on && isALPHA(name[0]) && ! ckWARN(WARN_ONCE))
+    if (isALPHA(name[0]) && ! (isLEXWARN_on ? ckWARN(WARN_ONCE) 
+                                           : (PL_dowarn & G_WARN_ON ) ) )
         GvMULTI_on(gv) ;
 
     /* set up magic where warranted */
index 7070dd4..512ee7f 100644 (file)
@@ -54,4 +54,19 @@ Name "main::x" used only once: possible typo at - line 4.
 use warnings 'once' ;
 $x = 3 ;
 EXPECT
+########
 
+# perl.c
+{ use warnings 'once' ; $x = 3 ; }
+$y = 3 ;
+EXPECT
+Name "main::x" used only once: possible typo at - line 3.
+########
+
+# perl.c
+$z = 3 ;
+BEGIN { $^W = 1 }
+{ no warnings 'once' ; $x = 3 ; }
+$y = 3 ;
+EXPECT
+Name "main::y" used only once: possible typo at - line 6.