Re: [ID 20010331.003] new misc warning for push(@x), unshift(@x)
Robin Houston [Mon, 2 Apr 2001 15:03:29 +0000 (16:03 +0100)]
Message-ID: <20010402150329.A6636@puffinry.freeserve.co.uk>

p4raw-id: //depot/perl@9532

op.c
pod/perldiag.pod
t/lib/db-recno.t
t/pragma/warn/op

diff --git a/op.c b/op.c
index 155f107..44a19d3 100644 (file)
--- a/op.c
+++ b/op.c
@@ -5679,6 +5679,12 @@ Perl_ck_fun(pTHX_ OP *o)
                    list(kid);
                break;
            case OA_AVREF:
+               if ((type == OP_PUSH || type == OP_UNSHIFT)
+                   && !kid->op_sibling && ckWARN(WARN_MISC))
+                   Perl_warner(aTHX_ WARN_MISC,
+                       "Useless use of %s with no arguments",
+                       PL_op_desc[type]);
+                   
                if (kid->op_type == OP_CONST &&
                    (kid->op_private & OPpCONST_BARE))
                {
index c6103c4..16b4ec2 100644 (file)
@@ -3949,6 +3949,15 @@ which means that Perl 5 will try to call the subroutine when the
 assignment is executed, which is probably not what you want.  (If it IS
 what you want, put an & in front.)
 
+=item Useless use of %s with no arguments
+
+(W misc) You used the push() or unshift() function with no arguments
+apart from the array, like C<push(@x)> or C<unshift(@foo)>. That won't
+usually have any effect on the array, so is completely useless. It's
+possible in principle that push(@tied_array) could have some effect
+if the array is tied to a class which implements a PUSH method. If so,
+you can write it as C<push(@tied_array,())> to avoid this warning.
+
 =back
 
 =cut
index 8b5a88c..4ca547f 100755 (executable)
@@ -202,7 +202,7 @@ ok(30, $value eq $shifted );
 # UNSHIFT
 
 # empty list
-($FA ? unshift @h : $X->unshift) ;
+($FA ? unshift @h,() : $X->unshift) ;
 ok(31, ($FA ? @h == @data : $X->length == @data ));
 
 my @new_data = qw(add this to the start of the array) ;
index f3c0548..ab2124e 100644 (file)
@@ -884,3 +884,15 @@ in begin
 in mainline
 in end
 in end
+########
+# op.c
+my @x;
+use warnings 'misc' ;
+push(@x);
+unshift(@x);
+no warnings 'misc' ;
+push(@x);
+unshift(@x);
+EXPECT
+Useless use of push with no arguments at - line 4.
+Useless use of unshift with no arguments at - line 5.