Generate the deprecation warnings for all uses $* or $#.
authorNicholas Clark <nick@ccl4.org>
Wed, 20 Mar 2013 11:00:11 +0000 (12:00 +0100)
committerNicholas Clark <nick@ccl4.org>
Thu, 21 Mar 2013 08:13:52 +0000 (09:13 +0100)
Previously it would fail to be generated if another variable using the same
typeglob was seen first (e.g. @* before $*), and would not be generated for
the second and subsequent uses.

It's hard to fix the failure to generate warnings at all without also
generating them every time, and warning every time is consistent with the
warnings that $[ used to generate.

dist/B-Deparse/t/deparse.t
gv.c
pod/perldelta.pod
t/lib/warnings/gv

index dc02c19..6b51d1e 100644 (file)
@@ -1058,8 +1058,9 @@ my @x;
 @x = ($#{<}, $#{.}, $#{>}, $#{/}, $#{?}, $#{=}, $#+, $#{\}, $#{|}, $#-);
 @x = ($#{;}, $#{:});
 ####
-# ${#} interpolated (the first line magically disables the warning)
-() = *#;
+# ${#} interpolated
+# It's a known TODO that warnings are deparsed as bits, not textually.
+no warnings;
 () = "${#}a";
 ####
 # [perl #86060] $( $| $) in regexps need braces
diff --git a/gv.c b/gv.c
index 8ac08ab..143323d 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1628,13 +1628,24 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
        if (add) {
            GvMULTI_on(gv);
            gv_init_svtype(gv, sv_type);
+            /* You reach this path once the typeglob has already been created,
+               either by the same or a different sigil.  If this path didn't
+               exist, then (say) referencing $! first, and %! second would
+               mean that %! was not handled correctly.  */
            if (len == 1 && stash == PL_defstash) {
              if (sv_type == SVt_PVHV || sv_type == SVt_PVGV) {
                if (*name == '!')
                    require_tie_mod(gv, "!", newSVpvs("Errno"), "TIEHASH", 1);
                else if (*name == '-' || *name == '+')
                    require_tie_mod(gv, name, newSVpvs("Tie::Hash::NamedCapture"), "TIEHASH", 0);
-             }
+              } else if (sv_type == SVt_PV) {
+                  if (*name == '*' || *name == '#') {
+                      /* diag_listed_as: $* is no longer supported */
+                      Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED,
+                                                       WARN_SYNTAX),
+                                       "$%c is no longer supported", *name);
+                  }
+              }
              if (sv_type==SVt_PV || sv_type==SVt_PVGV) {
                 switch (*name) {
                case '[':
index 2c964dd..3bce5f4 100644 (file)
@@ -198,13 +198,19 @@ XXX L<message|perldiag/"message">
 
 =head2 Changes to Existing Diagnostics
 
-XXX Changes (i.e. rewording) of diagnostic messages go here
-
 =over 4
 
 =item *
 
-XXX Describe change here
+L<$* is no longer supported|perldiag/"$* is no longer supported">
+
+The warning that use of C<$*> and C<$#> is no longer supported is now
+generated for every location that references them.  Previously it would fail
+to be generated if another variable using the same typeglob was seen first
+(e.g. C<@*> before C<$*>), and would not be generated for the second and
+subsequent uses.  (It's hard to fix the failure to generate warnings at all
+without also generating them every time, and warning every time is
+consistent with the warnings that C<$[> used to generate.)
 
 =back
 
index fcdf1b5..6b022e1 100644 (file)
@@ -75,29 +75,39 @@ $* is no longer supported at - line 3.
 # gv.c
 $a = $#;
 $a = $*;
+$# = $a;
+$* = $a;
+$a = \$#;
+$a = \$*;
 no warnings 'deprecated' ;
 $a = $#;
 $a = $*;
+$# = $a;
+$* = $a;
+$a = \$#;
+$a = \$*;
 EXPECT
 $# is no longer supported at - line 2.
 $* is no longer supported at - line 3.
+$# is no longer supported at - line 4.
+$* is no longer supported at - line 5.
+$# is no longer supported at - line 6.
+$* is no longer supported at - line 7.
 ########
 # gv.c
-$# = $a;
-$* = $a;
-no warnings 'deprecated' ;
-$# = $a;
-$* = $a;
+@a = @#;
+@a = @*;
+$a = $#;
+$a = $*;
 EXPECT
-$# is no longer supported at - line 2.
-$* is no longer supported at - line 3.
+$# is no longer supported at - line 4.
+$* is no longer supported at - line 5.
 ########
 # gv.c
-$a = \$#;
-$a = \$*;
-no warnings 'deprecated' ;
-$a = \$#;
-$a = \$*;
+$a = $#;
+$a = $*;
+@a = @#;
+@a = @*;
 EXPECT
 $# is no longer supported at - line 2.
 $* is no longer supported at - line 3.