Negation and Unicode: sort of solves 20010303.010,
Jarkko Hietaniemi [Tue, 23 Oct 2001 22:19:34 +0000 (22:19 +0000)]
except not quite like reported in the Subject
(Perl_warner is still utf8-ignorant).

p4raw-id: //depot/perl@12614

pp.c
t/lib/warnings/sv

diff --git a/pp.c b/pp.c
index a0729e9..c182e9a 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -2157,15 +2157,22 @@ PP(pp_negate)
                sv_setsv(TARG, sv);
                *SvPV_force(TARG, len) = *s == '-' ? '+' : '-';
            }
-           else if (DO_UTF8(sv) && UTF8_IS_START(*s) && isIDFIRST_utf8((U8*)s)) {
-               sv_setpvn(TARG, "-", 1);
-               sv_catsv(TARG, sv);
+           else if (DO_UTF8(sv)) {
+               SvIV_please(sv);
+               if (SvIOK(sv))
+                   goto oops_its_an_int;
+               if (SvNOK(sv))
+                   sv_setnv(TARG, -SvNV(sv));
+               else {
+                   sv_setpvn(TARG, "-", 1);
+                   sv_catsv(TARG, sv);
+               }
            }
            else {
-             SvIV_please(sv);
-             if (SvIOK(sv))
-               goto oops_its_an_int;
-             sv_setnv(TARG, -SvNV(sv));
+               SvIV_please(sv);
+               if (SvIOK(sv))
+                 goto oops_its_an_int;
+               sv_setnv(TARG, -SvNV(sv));
            }
            SETTARG;
        }
index 9af58c2..29bef82 100644 (file)
@@ -326,3 +326,11 @@ no warnings 'numeric' ;
 $a = "\x{100}\x{200}" * 42;
 EXPECT
 Argument "\x{100}\x{200}" isn't numeric in multiplication (*) at - line 3.
+########
+# sv.c
+use warnings 'numeric' ;
+$a = "\x{100}\x{200}"; $a = -$a;
+no warnings 'numeric' ;
+$a = "\x{100}\x{200}"; $a = -$a;
+EXPECT
+Argument "\x{100}\x{200}" isn't numeric in negation (-) at - line 3.