Add a deprecation warning for all uses of @*, %*, &* and **.
authorNicholas Clark <nick@ccl4.org>
Wed, 20 Mar 2013 15:47:16 +0000 (16:47 +0100)
committerNicholas Clark <nick@ccl4.org>
Thu, 21 Mar 2013 08:13:52 +0000 (09:13 +0100)
All compile-time uses of the ** typeglob now warn.

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

index 6b51d1e..f26aa96 100644 (file)
@@ -1053,11 +1053,16 @@ print $_;
 ####
 # $#- $#+ $#{%} etc.
 my @x;
-@x = ($#{`}, $#{~}, $#{!}, $#{@}, $#{$}, $#{%}, $#{^}, $#{&}, $#{*});
+@x = ($#{`}, $#{~}, $#{!}, $#{@}, $#{$}, $#{%}, $#{^}, $#{&});
 @x = ($#{(}, $#{)}, $#{[}, $#{{}, $#{]}, $#{}}, $#{'}, $#{"}, $#{,});
 @x = ($#{<}, $#{.}, $#{>}, $#{/}, $#{?}, $#{=}, $#+, $#{\}, $#{|}, $#-);
 @x = ($#{;}, $#{:});
 ####
+# $#{*}
+# It's a known TODO that warnings are deparsed as bits, not textually.
+no warnings;
+() = $#{*};
+####
 # ${#} interpolated
 # It's a known TODO that warnings are deparsed as bits, not textually.
 no warnings;
diff --git a/gv.c b/gv.c
index 7e954d8..d96bde8 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1638,16 +1638,23 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                    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 == '*') {
+              } else if (sv_type == SVt_PV && *name == '#') {
+                  Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED,
+                                                   WARN_SYNTAX),
+                                   "$# is no longer supported");
+              }
+              if (*name == '*') {
+                  if (sv_type == SVt_PV)
                       Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED,
                                                        WARN_SYNTAX),
                                        "$* is no longer supported, and will become a syntax error");
-                  } else if (*name == '#') {
-                      Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED,
-                                                       WARN_SYNTAX),
-                                       "$# is no longer supported");
-                  }
+                  else
+                      Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
+                                       "%c* is deprecated, and will become a syntax error",
+                                       sv_type == SVt_PVAV ? '@'
+                                       : sv_type == SVt_PVCV ? '&'
+                                       : sv_type == SVt_PVHV ? '%'
+                                       : '*');
               }
              if (sv_type==SVt_PV || sv_type==SVt_PVGV) {
                 switch (*name) {
@@ -1940,6 +1947,14 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
            if (sv_type == SVt_PV)
                Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
                                 "$* is no longer supported, and will become a syntax error");
+            else {
+               Perl_ck_warner_d(aTHX_ packWARN2(WARN_DEPRECATED, WARN_SYNTAX),
+                                 "%c* is deprecated, and will become a syntax error",
+                                 sv_type == SVt_PVAV ? '@'
+                                 : sv_type == SVt_PVCV ? '&'
+                                 : sv_type == SVt_PVHV ? '%'
+                                 : '*');
+            }
            break;
        case '#':               /* $# */
            if (sv_type == SVt_PV)
index 1a17400..68f070f 100644 (file)
@@ -192,7 +192,12 @@ XXX L<message|perldiag/"message">
 
 =item *
 
-XXX L<message|perldiag/"message">
+L%c* is deprecated, and will become a syntax error|perldiag/"%c* is deprecated, and will become a syntax error">
+
+Use of C<@*>, C<&*>, C<**> or C<%*> is now deprecated, and will generate a
+compile time warning, enabled by default.  In future such code will fail to
+compile with a syntax error.  Removing these variables, along with C<$*>,
+will permit future syntax additions.
 
 =back
 
index 069e1aa..17d13ce 100644 (file)
@@ -2618,6 +2618,13 @@ modifiers.  You can enable C</m> for a lexical scope (even a whole file)
 with C<use re '/m'>.  (In older versions: when C<$*> was set to a true value
 then all regular expressions behaved as if they were written using C</m>.)
 
+=item %c* is deprecated, and will become a syntax error
+
+(D deprecated, syntax) The punctuation variables C<@*>, C<&*>, C<**> and
+C<%*> will be removed soon.  In future such code will fail to compile with a
+syntax error.  Removing these variables along with C<$*> will permit future
+syntax additions.
+
 =item $# is no longer supported
 
 (D deprecated, syntax) The special variable C<$#>, deprecated in older
index 1618e40..332810c 100644 (file)
@@ -100,6 +100,7 @@ $* is no longer supported, and will become a syntax error at - line 7.
 $a = $#;
 $a = $*;
 EXPECT
+@* is deprecated, and will become a syntax error at - line 3.
 $# is no longer supported at - line 4.
 $* is no longer supported, and will become a syntax error at - line 5.
 ########
@@ -111,6 +112,23 @@ $a = $*;
 EXPECT
 $# is no longer supported at - line 2.
 $* is no longer supported, and will become a syntax error at - line 3.
+@* is deprecated, and will become a syntax error at - line 5.
+########
+# gv.c
+$a = \@*;
+$a = \&*;
+$a = \**;
+$a = \%*;
+no warnings 'deprecated' ;
+$a = \@*;
+$a = \&*;
+$a = \**;
+$a = \%*;
+EXPECT
+@* is deprecated, and will become a syntax error at - line 2.
+&* is deprecated, and will become a syntax error at - line 3.
+** is deprecated, and will become a syntax error at - line 4.
+%* is deprecated, and will become a syntax error at - line 5.
 ########
 # gv.c
 use warnings 'syntax' ;