]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix byte-compilation of (+ -0.0) (bug#42597)
authorMattias Engdegård <mattiase@acm.org>
Mon, 3 Aug 2020 13:29:41 +0000 (15:29 +0200)
committerMattias Engdegård <mattiase@acm.org>
Fri, 7 Aug 2020 07:41:15 +0000 (09:41 +0200)
* lisp/emacs-lisp/bytecomp.el (byte-compile-associative):
Translate numerical identity expressions, such as (+ x) and (* x),
into (* x 1) since the previous translation (+ x 0) gets it wrong
for x = -0.0.
* test/lisp/emacs-lisp/bytecomp-tests.el
(byte-opt-testsuite-arith-data): Add test cases.

lisp/emacs-lisp/bytecomp.el
test/lisp/emacs-lisp/bytecomp-tests.el

index 22e648e44ba3614a95f9098de9cb7c8300237753..8f76a3abb9956e8b2c17b396c29bebb634445127 100644 (file)
@@ -3733,7 +3733,7 @@ discarding."
 ;; Compile a function that accepts one or more args and is right-associative.
 ;; We do it by left-associativity so that the operations
 ;; are done in the same order as in interpreted code.
-;; We treat the one-arg case, as in (+ x), like (+ x 0).
+;; We treat the one-arg case, as in (+ x), like (* x 1).
 ;; in order to convert markers to numbers, and trigger expected errors.
 (defun byte-compile-associative (form)
   (if (cdr form)
@@ -3748,8 +3748,8 @@ discarding."
          (setq args (copy-sequence (cdr form)))
          (byte-compile-form (car args))
          (setq args (cdr args))
-         (or args (setq args '(0)
-                        opcode (get '+ 'byte-opcode)))
+         (or args (setq args '(1)
+                        opcode (get '* 'byte-opcode)))
          (dolist (arg args)
            (byte-compile-form arg)
            (byte-compile-out opcode 0))))
index c235dd43fccc92c1b361e9e378c9d01fc70fde72..894914300aef008aa47b0af3c9eafd0121774323 100644 (file)
     (let ((a 1.0))                                (/ 3 a 2))
     (let ((a most-positive-fixnum) (b 2.0))       (* a 2 b))
     (let ((a 3) (b 2))                            (/ a b 1.0))
+    (let ((a -0.0)) (+ a))
+    (let ((a -0.0)) (- a))
+    (let ((a -0.0)) (* a))
+    (let ((a -0.0)) (min a))
+    (let ((a -0.0)) (max a))
     (/ 3 -1)
     (+ 4 3 2 1)
     (+ 4 3 2.0 1)