]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix bug with min and max and NaNs
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 17 Sep 2017 22:25:44 +0000 (15:25 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Sun, 17 Sep 2017 22:26:41 +0000 (15:26 -0700)
* src/data.c (minmax_driver): Fix bug with (min 0 NaN), which
mistakenly yielded 0.  Also, pacify GCC in a better way.
* test/src/data-tests.el (data-tests-min): Test for the bug.

src/data.c
test/src/data-tests.el

index 95bf06e51026b48f8e4469b3625d67b512108412..e070be6c208d008bb947f0aae5813d771f9693b4 100644 (file)
@@ -3010,16 +3010,16 @@ static Lisp_Object
 minmax_driver (ptrdiff_t nargs, Lisp_Object *args,
               enum Arith_Comparison comparison)
 {
-  eassume (0 < nargs);
-  Lisp_Object accum = args[0]; /* pacify GCC */
-  for (ptrdiff_t argnum = 0; argnum < nargs; argnum++)
+  Lisp_Object accum = args[0];
+  CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (accum);
+  for (ptrdiff_t argnum = 1; argnum < nargs; argnum++)
     {
       Lisp_Object val = args[argnum];
       CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val);
-      if (argnum == 0 || !NILP (arithcompare (val, accum, comparison)))
+      if (!NILP (arithcompare (val, accum, comparison)))
        accum = val;
-      else if (FLOATP (accum) && isnan (XFLOAT_DATA (accum)))
-       return accum;
+      else if (FLOATP (val) && isnan (XFLOAT_DATA (val)))
+       return val;
     }
   return accum;
 }
index 5dc26348a6fadb3d45ac1a2b57dce83d1848da03..8de8c145d40c6c18d4f760b503b1ae3daa4c7acd 100644 (file)
   (should (= 3 (apply #'min '(3 8 3))))
   (should-error (min 9 8 'foo))
   (should-error (min (make-marker)))
-  (should (eql 1 (min (point-min-marker) 1))))
+  (should (eql 1 (min (point-min-marker) 1)))
+  (should (isnan (min 0.0e+NaN)))
+  (should (isnan (min 0.0e+NaN 1 2)))
+  (should (isnan (min 1.0 0.0e+NaN)))
+  (should (isnan (min 1.0 0.0e+NaN 1.1))))
 
 ;; Bool vector tests.  Compactly represent bool vectors as hex
 ;; strings.