Fix sv_dec of undefined PVs to (a) not downgrade to NV
Nicholas Clark [Mon, 27 Jun 2005 20:52:27 +0000 (20:52 +0000)]
(b) give -1, rather than +1

p4raw-id: //depot/perl@24998

sv.c
t/op/inc.t

diff --git a/sv.c b/sv.c
index 26e780e..c2d8572 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -7075,10 +7075,10 @@ Perl_sv_dec(pTHX_ register SV *sv)
        return;
     }
     if (!(flags & SVp_POK)) {
-       if ((flags & SVTYPEMASK) < SVt_PVNV)
-           sv_upgrade(sv, SVt_NV);
-       SvNV_set(sv, 1.0);
-       (void)SvNOK_only(sv);
+       if ((flags & SVTYPEMASK) < SVt_PVIV)
+           sv_upgrade(sv, ((flags & SVTYPEMASK) > SVt_IV) ? SVt_PVIV : SVt_IV);
+       SvIV_set(sv, -1);
+       (void)SvIOK_only(sv);
        return;
     }
 #ifdef PERL_PRESERVE_IVUV
index 56d27d2..156ca92 100755 (executable)
@@ -2,7 +2,7 @@
 
 # use strict;
 
-print "1..26\n";
+print "1..30\n";
 
 my $test = 1;
 
@@ -157,3 +157,22 @@ foreach (keys %postdec) {
 }
 
 check_same (\%orig, \%postdec);
+
+{
+    no warnings 'uninitialized';
+    my $x, $y;
+    eval {
+       $y ="$x\n";
+       ++$x;
+    };
+    ok($x == 1, $x);
+    ok($@ eq '', $@);
+
+    my $p, $q;
+    eval {
+       $q ="$p\n";
+       --$p;
+    };
+    ok($p == -1, $p);
+    ok($@ eq '', $@);
+}