my() in a false conditional will be fatal in Perl 5.30
authorAbigail <abigail@abigail.be>
Sat, 14 Jan 2017 01:30:49 +0000 (02:30 +0100)
committerAbigail <abigail@abigail.be>
Mon, 16 Jan 2017 18:18:15 +0000 (19:18 +0100)
op.c
pod/perldeprecation.pod
pod/perldiag.pod
t/lib/warnings/op

diff --git a/op.c b/op.c
index c213bb6..2c4935e 100644 (file)
--- a/op.c
+++ b/op.c
@@ -6974,7 +6974,8 @@ S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
                && !(o2->op_private & OPpPAD_STATE))
            {
                Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
-                                "Deprecated use of my() in false conditional");
+                                "Deprecated use of my() in false conditional. "
+                                "This will be a fatal error in Perl 5.30");
            }
 
            *otherp = NULL;
index bdacbc2..6a827fb 100644 (file)
@@ -63,6 +63,36 @@ and an unqualified C<dump()> will no longer be available in Perl 5.30.
 See L<perlfunc/dump>.
 
 
+=head2 Using my() in false conditional.
+
+There has been a long-standing bug in Perl that causes a lexical variable
+not to be cleared at scope exit when its declaration includes a false
+conditional.  Some people have exploited this bug to achieve a kind of
+static variable.  Since we intend to fix this bug, we don't want people
+relying on this behavior.
+
+Instead, it's recommended one uses C<state> variables to achieve the
+same effect:
+
+    use 5.10.0;
+    sub count {state $counter; return ++ $counter}
+    say count ();    # Prints 1
+    say count ();    # Prints 2
+
+C<state> variables were introduced in Perl 5.10.
+
+Alternatively, you can achieve a similar static effect by
+declaring the variable in a separate block outside the function, eg
+
+    sub f { my $x if 0; return $x++ }
+
+becomes
+
+    { my $x; sub f { return $x++ } }
+
+The use of C<my()> in a false conditional has been deprecated in
+Perl 5.10, and it will become a fatal error in Perl 5.30.
+
 =head2 Perl 5.28
 
 =head3 Attribute "%s" is deprecated, and will disappear in 5.28
index aedec64..9aab53a 100644 (file)
@@ -1979,7 +1979,7 @@ or a hash or array slice, such as:
 long for Perl to handle.  You have to be seriously twisted to write code
 that triggers this error.
 
-=item Deprecated use of my() in false conditional
+=item Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30
 
 (D deprecated) You used a declaration similar to C<my $x if 0>.  There
 has been a long-standing bug in Perl that causes a lexical variable
@@ -2000,6 +2000,9 @@ lexicals that are initialized only once (see L<feature>):
 
     sub f { state $x; return $x++ }
 
+This use of C<my()> in a false conditional has been deprecated since
+Perl 5.10, and it will become a fatal error in Perl 5.30.
+
 =item DESTROY created new reference to dead object '%s'
 
 (F) A DESTROY() method created a new reference to the object which is
index 37ebbbe..46885e2 100644 (file)
@@ -1772,13 +1772,13 @@ if (my $w2) { $a=1 }
 if ($a && (my $w3 = 1)) {$a = 2}
 
 EXPECT
-Deprecated use of my() in false conditional at - line 2.
-Deprecated use of my() in false conditional at - line 3.
-Deprecated use of my() in false conditional at - line 4.
-Deprecated use of my() in false conditional at - line 5.
-Deprecated use of my() in false conditional at - line 6.
-Deprecated use of my() in false conditional at - line 7.
-Deprecated use of my() in false conditional at - line 8.
+Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 at - line 2.
+Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 at - line 3.
+Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 at - line 4.
+Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 at - line 5.
+Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 at - line 6.
+Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 at - line 7.
+Deprecated use of my() in false conditional. This will be a fatal error in Perl 5.30 at - line 8.
 ########
 # op.c
 $[ = 1;