infnan: ++ or -- on infnan doesn't lose precision.
authorJarkko Hietaniemi <jhi@iki.fi>
Fri, 19 Sep 2014 01:15:03 +0000 (21:15 -0400)
committerJarkko Hietaniemi <jhi@iki.fi>
Fri, 19 Sep 2014 02:10:09 +0000 (22:10 -0400)
(found by bulk88)

sv.c

diff --git a/sv.c b/sv.c
index 9df01b7..6cee603 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -8607,7 +8607,8 @@ Perl_sv_inc_nomg(pTHX_ SV *const sv)
     }
     if (flags & SVp_NOK) {
        const NV was = SvNVX(sv);
-       if (NV_OVERFLOWS_INTEGERS_AT &&
+       if (!Perl_isinfnan(was) &&
+            NV_OVERFLOWS_INTEGERS_AT &&
            was >= NV_OVERFLOWS_INTEGERS_AT) {
            /* diag_listed_as: Lost precision when %s %f by 1 */
            Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),
@@ -8785,7 +8786,8 @@ Perl_sv_dec_nomg(pTHX_ SV *const sv)
     oops_its_num:
        {
            const NV was = SvNVX(sv);
-           if (NV_OVERFLOWS_INTEGERS_AT &&
+           if (!Perl_isinfnan(was) &&
+                NV_OVERFLOWS_INTEGERS_AT &&
                was <= -NV_OVERFLOWS_INTEGERS_AT) {
                /* diag_listed_as: Lost precision when %s %f by 1 */
                Perl_ck_warner(aTHX_ packWARN(WARN_IMPRECISION),