diff options
| author | Paul Eggert | 2017-09-17 15:25:44 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-09-17 15:26:41 -0700 |
| commit | 5f28f0db73c03b98b27e04a458ebb209b5d9acde (patch) | |
| tree | 4c431e51e3e20d6b847907d014b1aea7754f34da | |
| parent | 37b5e661d298cbfe51422cd515b6696a1cdaa868 (diff) | |
| download | emacs-5f28f0db73c03b98b27e04a458ebb209b5d9acde.tar.gz emacs-5f28f0db73c03b98b27e04a458ebb209b5d9acde.zip | |
Fix bug with min and max and NaNs
* 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.
| -rw-r--r-- | src/data.c | 12 | ||||
| -rw-r--r-- | test/src/data-tests.el | 6 |
2 files changed, 11 insertions, 7 deletions
diff --git a/src/data.c b/src/data.c index 95bf06e5102..e070be6c208 100644 --- a/src/data.c +++ b/src/data.c | |||
| @@ -3010,16 +3010,16 @@ static Lisp_Object | |||
| 3010 | minmax_driver (ptrdiff_t nargs, Lisp_Object *args, | 3010 | minmax_driver (ptrdiff_t nargs, Lisp_Object *args, |
| 3011 | enum Arith_Comparison comparison) | 3011 | enum Arith_Comparison comparison) |
| 3012 | { | 3012 | { |
| 3013 | eassume (0 < nargs); | 3013 | Lisp_Object accum = args[0]; |
| 3014 | Lisp_Object accum = args[0]; /* pacify GCC */ | 3014 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (accum); |
| 3015 | for (ptrdiff_t argnum = 0; argnum < nargs; argnum++) | 3015 | for (ptrdiff_t argnum = 1; argnum < nargs; argnum++) |
| 3016 | { | 3016 | { |
| 3017 | Lisp_Object val = args[argnum]; | 3017 | Lisp_Object val = args[argnum]; |
| 3018 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val); | 3018 | CHECK_NUMBER_OR_FLOAT_COERCE_MARKER (val); |
| 3019 | if (argnum == 0 || !NILP (arithcompare (val, accum, comparison))) | 3019 | if (!NILP (arithcompare (val, accum, comparison))) |
| 3020 | accum = val; | 3020 | accum = val; |
| 3021 | else if (FLOATP (accum) && isnan (XFLOAT_DATA (accum))) | 3021 | else if (FLOATP (val) && isnan (XFLOAT_DATA (val))) |
| 3022 | return accum; | 3022 | return val; |
| 3023 | } | 3023 | } |
| 3024 | return accum; | 3024 | return accum; |
| 3025 | } | 3025 | } |
diff --git a/test/src/data-tests.el b/test/src/data-tests.el index 5dc26348a6f..8de8c145d40 100644 --- a/test/src/data-tests.el +++ b/test/src/data-tests.el | |||
| @@ -101,7 +101,11 @@ | |||
| 101 | (should (= 3 (apply #'min '(3 8 3)))) | 101 | (should (= 3 (apply #'min '(3 8 3)))) |
| 102 | (should-error (min 9 8 'foo)) | 102 | (should-error (min 9 8 'foo)) |
| 103 | (should-error (min (make-marker))) | 103 | (should-error (min (make-marker))) |
| 104 | (should (eql 1 (min (point-min-marker) 1)))) | 104 | (should (eql 1 (min (point-min-marker) 1))) |
| 105 | (should (isnan (min 0.0e+NaN))) | ||
| 106 | (should (isnan (min 0.0e+NaN 1 2))) | ||
| 107 | (should (isnan (min 1.0 0.0e+NaN))) | ||
| 108 | (should (isnan (min 1.0 0.0e+NaN 1.1)))) | ||
| 105 | 109 | ||
| 106 | ;; Bool vector tests. Compactly represent bool vectors as hex | 110 | ;; Bool vector tests. Compactly represent bool vectors as hex |
| 107 | ;; strings. | 111 | ;; strings. |