Time limit the deprecation of :unique and :locked.
authorAbigail <abigail@abigail.be>
Tue, 15 Nov 2016 18:35:28 +0000 (19:35 +0100)
committerAbigail <abigail@abigail.be>
Mon, 16 Jan 2017 18:18:11 +0000 (19:18 +0100)
The :unique and :locked attributes have had no effect since 5.8.8
and 5.005 respectively. They were deprecated in 5.12. They are now
scheduled to be deleted in 5.28.

There are two places the deprecation warning can be issued:
in lib/attributes.pm, and in toke.c. The warnings were phrased
differently, but since we're changing the warning anyway (as we
added the version of Perl in which the attributes will disappear),
we've used the same phrasing for this warning, regardless of where
it is generated:

    Attribute "locked" is deprecated, and will disappear in Perl 5.28
    Attribute "unique" is deprecated, and will disappear in Perl 5.28

ext/attributes/attributes.pm
handy.h
pod/perldeprecation.pod
pod/perldiag.pod
t/lib/warnings/toke
t/op/attrs.t
toke.c

index 67662e4..7eb8e30 100644 (file)
@@ -1,6 +1,6 @@
 package attributes;
 
-our $VERSION = 0.28;
+our $VERSION = 0.29;
 
 @EXPORT_OK = qw(get reftype);
 @EXPORT = ();
@@ -38,7 +38,8 @@ sub _modify_attrs_and_deprecate {
     grep {
        $deprecated{$svtype} && /$deprecated{$svtype}/ ? do {
            require warnings;
-           warnings::warnif('deprecated', "Attribute \"$1\" is deprecated");
+           warnings::warnif('deprecated', "Attribute \"$1\" is deprecated, " .
+                                           "and will disappear in Perl 5.28");
            0;
        } : $svtype eq 'CODE' && exists $msg{$_} ? do {
            require warnings;
@@ -258,7 +259,8 @@ attribute will be sanity checked at compile time.
 =item locked
 
 The "locked" attribute is deprecated, and has no effect in 5.10.0 and later.
-It was used as part of the now-removed "Perl 5.005 threads".
+It was used as part of the now-removed "Perl 5.005 threads". It will
+disappear in Perl 5.28, after which its use will be fatal.
 
 =item const
 
@@ -283,7 +285,8 @@ when used in conjunction with the L<threads> and L<threads::shared> modules.
 The "unique" attribute is deprecated, and has no effect in 5.10.0 and later.
 It used to indicate that a single copy of an C<our> variable was to be used by
 all interpreters should the program happen to be running in a
-multi-interpreter environment.
+multi-interpreter environment. It will disappear in 5.28, after which its
+use will be fatal.
 
 =back
 
diff --git a/handy.h b/handy.h
index dd3e01c..041d1c4 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -2477,6 +2477,9 @@ void Perl_mem_log_del_sv(const SV *sv, const char *filename, const int linenumbe
 #ifdef PERL_CORE
 #  define deprecate(s) Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),    \
                                             "Use of " s " is deprecated")
+#  define deprecate_disappears_in(when,message) \
+              Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),    \
+                               message ", and will disappear in Perl " when)
 #endif
 
 /* Internal macros to deal with gids and uids */
index 097bb57..95f89d2 100644 (file)
@@ -30,6 +30,20 @@ disappear in perl 5.30.
 Code using C<< File::Glob::glob() >> should call
 C<< File::Glob::bsd_glob() >> instead.
 
+=head2 Perl 5.28
+
+=head3 Attribute "%s" is deprecated, and will disappear in 5.28
+
+The attributes C<< :locked >> (on code references) and C<< :unique >>
+(on array, hash and scalar references) have had no effect since 
+Perl 5.005 and Perl 5.8.8 respectively. Their use has been deprecated
+since.
+
+These attributes will no longer be recognized in Perl 5.28, and will
+then result in a syntax error. Since the attributes do not do anything,
+removing them from your code fixes the deprecation warning; and removing
+them will not influence the behaviour of your code.
+
 =head2 Perl 5.24
 
 =head3 Use of C<< *glob{FILEHANDLE} >>
index a1be466..cc8aaea 100644 (file)
@@ -418,12 +418,12 @@ assigning through that reference.  For example
 used as an lvalue, which is pretty strange.  Perhaps you forgot to
 dereference it first.  See L<perlfunc/substr>.
 
-=item Attribute "locked" is deprecated
+=item Attribute "locked" is deprecated, and will disappear in Perl 5.28
 
 (D deprecated) You have used the attributes pragma to modify the
 "locked" attribute on a code reference.  The :locked attribute is
 obsolete, has had no effect since 5005 threads were removed, and
-will be removed in a future release of Perl 5.
+will be removed in a Perl 5.28.
 
 =item Attribute prototype(%s) discards earlier prototype attribute in same sub
 
@@ -431,12 +431,12 @@ will be removed in a future release of Perl 5.
 example.  Since each sub can only have one prototype, the earlier
 declaration(s) are discarded while the last one is applied.
 
-=item Attribute "unique" is deprecated
+=item Attribute "unique" is deprecated, and will disappear in Perl 5.28
 
 (D deprecated) You have used the attributes pragma to modify
 the "unique" attribute on an array, hash or scalar reference.
 The :unique attribute has had no effect since Perl 5.8.8, and
-will be removed in a future release of Perl 5.
+will be removed in a Perl 5.28.
 
 =item av_reify called on tied array
 
index 828d597..3ad67e0 100644 (file)
@@ -1236,10 +1236,10 @@ sub ker_plop :locked {
 sub swa_a_p ($) : locked {
 }
 EXPECT
-Use of :unique is deprecated at - line 2.
-Use of :locked is deprecated at - line 3.
-Use of :locked is deprecated at - line 4.
-Use of :locked is deprecated at - line 6.
+Attribute "unique" is deprecated, and will disappear in Perl 5.28 at - line 2.
+Attribute "locked" is deprecated, and will disappear in Perl 5.28 at - line 3.
+Attribute "locked" is deprecated, and will disappear in Perl 5.28 at - line 4.
+Attribute "locked" is deprecated, and will disappear in Perl 5.28 at - line 6.
 ########
 # toke.c
 use warnings "syntax";
index 0d0fdd1..c3cf439 100644 (file)
@@ -177,7 +177,8 @@ foreach my $value (\&foo, \$scalar, \@array, \%hash) {
            my $attribute = $negate . $attr;
            eval "use attributes __PACKAGE__, \$value, '$attribute'";
            if ($deprecated{$type}{$attr}) {
-               like $@, qr/^Attribute "$attr" is deprecated at \(eval \d+\)/,
+               like $@, qr/^Attribute "$attr" is deprecated, (?#:
+                            )and will disappear in Perl 5.28 at \(eval \d+\)/,
                    "$type attribute $attribute deprecated";
            } elsif ($valid{$type}{$attr}) {
                if ($attribute eq '-shared') {
diff --git a/toke.c b/toke.c
index 3b36404..8cebad1 100644 (file)
--- a/toke.c
+++ b/toke.c
@@ -5771,7 +5771,8 @@ Perl_yylex(pTHX)
                    if (len == 6 && strnEQ(SvPVX(sv), "unique", len)) {
                        sv_free(sv);
                        if (PL_in_my == KEY_our) {
-                           deprecate(":unique");
+                            deprecate_disappears_in("5.28",
+                                "Attribute \"unique\" is deprecated");
                        }
                        else
                            Perl_croak(aTHX_ "The 'unique' attribute may only be applied to 'our' variables");
@@ -5785,7 +5786,8 @@ Perl_yylex(pTHX)
                    }
                    else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "locked", len)) {
                        sv_free(sv);
-                       deprecate(":locked");
+                        deprecate_disappears_in("5.28",
+                            "Attribute \"locked\" is deprecated");
                    }
                    else if (!PL_in_my && len == 6 && strnEQ(SvPVX(sv), "method", len)) {
                        sv_free(sv);