This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Use ‘state’ in warning about sort {state $a}
authorFather Chrysostomos <sprout@cpan.org>
Wed, 4 Jul 2012 13:11:27 +0000 (06:11 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Wed, 4 Jul 2012 15:53:50 +0000 (08:53 -0700)
op.c
pod/perldiag.pod
t/lib/warnings/op

diff --git a/op.c b/op.c
index 14cc21f..311f5a0 100644 (file)
--- a/op.c
+++ b/op.c
@@ -9350,8 +9350,10 @@ S_simplify_sort(pTHX_ OP *o)
                SV * const name = AvARRAY(PL_comppad_name)[kid->op_targ];
                if (SvCUR(name) == 2 && *SvPVX(name) == '$'
                 && (SvPVX(name)[1] == 'a' || SvPVX(name)[1] == 'b'))
+                   /* diag_listed_as: "my %s" used in sort comparison */
                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
-                                    "\"my %s\" used in sort comparison",
+                                    "\"%s %s\" used in sort comparison",
+                                     SvPAD_STATE(name) ? "state" : "my",
                                      SvPVX(name));
            }
        } while ((kid = kid->op_sibling));
index 11b5e34..327f392 100644 (file)
@@ -4538,6 +4538,14 @@ a block by itself.
 sense to try to declare one with a package qualifier on the front.  Use
 local() if you want to localize a package variable.
 
+=item "state %s" used in sort comparison
+
+(W syntax) The package variables $a and $b are used for sort comparisons.
+You used $a or $b in as an operand to the C<< <=> >> or C<cmp> operator inside a
+sort comparison block, and the variable had earlier been declared as a
+lexical variable.  Either qualify the sort variable with the package
+name, or rename the lexical variable.
+
 =item stat() on unopened filehandle %s
 
 (W unopened) You tried to use the stat() function on a filehandle that
index f74b720..c6a3bb8 100644 (file)
@@ -1033,6 +1033,13 @@ EXPECT
 "my $b" used in sort comparison at - line 1208.
 "my $a" used in sort comparison at - line 1208.
 ########
+# op.c [S_simplify_sort]
+use warnings 'syntax'; use 5.01;
+state $a;
+sort { $a <=> $b } ();
+EXPECT
+"state $a" used in sort comparison at - line 4.
+########
 # op.c [Perl_ck_cmp]
 use warnings 'syntax' ;
 no warnings 'deprecated';