Add a new warning "Negative repeat count"
Rafael Garcia-Suarez [Sun, 21 Mar 2004 13:06:20 +0000 (13:06 +0000)]
for the cases $x x -1.

p4raw-id: //depot/perl@22543

pod/perlop.pod
pp.c
t/lib/warnings/pp

index 86cb294..4430fe7 100644 (file)
@@ -238,7 +238,9 @@ Binary "x" is the repetition operator.  In scalar context or if the left
 operand is not enclosed in parentheses, it returns a string consisting
 of the left operand repeated the number of times specified by the right
 operand.  In list context, if the left operand is enclosed in
-parentheses, it repeats the list.
+parentheses, it repeats the list.  If the right operand is zero or
+negative, it returns an empty string or an empty list, depending on the
+context.
 
     print '-' x 80;            # print row of dashes
 
diff --git a/pp.c b/pp.c
index d3434c3..53c7162 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -1386,6 +1386,11 @@ PP(pp_repeat)
   dSP; dATARGET; tryAMAGICbin(repeat,opASSIGN);
   {
     register IV count = POPi;
+    if (count < 0) {
+       if (ckWARN(WARN_MISC))
+           Perl_warner(aTHX_ packWARN(WARN_MISC), "Negative repeat count");
+       count = 0;
+    }
     if (GIMME == G_ARRAY && PL_op->op_private & OPpREPEAT_DOLIST) {
        dMARK;
        I32 items = SP - MARK;
index 5ed7aa0..db42027 100644 (file)
@@ -102,3 +102,12 @@ use utf8 ;
 $_ = "\x80  \xff" ;
 reverse ;
 EXPECT
+########
+# pp.c
+use warnings;
+$a = "b" x -1;
+$a = "b" x 0;
+no warnings;
+$a = "b" x -1;
+EXPECT
+Negative repeat count at - line 3.