diff options
author | Andrea Corallo <akrl@sdf.org> | 2022-02-09 17:38:10 +0100 |
---|---|---|
committer | Andrea Corallo <akrl@sdf.org> | 2022-02-09 17:58:57 +0100 |
commit | 69e82968d7c2b64710f6f6b79597ac98c82449e7 (patch) | |
tree | 828f8d8beeca786a9c92052d6044d67830e17547 /lisp/emacs-lisp | |
parent | 31af9bca99fa88350271e1a905c9b435eaec28cf (diff) | |
download | emacs-69e82968d7c2b64710f6f6b79597ac98c82449e7.tar.gz emacs-69e82968d7c2b64710f6f6b79597ac98c82449e7.tar.bz2 emacs-69e82968d7c2b64710f6f6b79597ac98c82449e7.zip |
Fix integer arithmetic miss-compilation (bug#53451)
* lisp/emacs-lisp/comp-cstr.el (comp-cstr-set-range-for-arithm):
When one of the two sources is negated revert to set dst as
number.
* test/src/comp-tests.el (comp-tests-type-spec-tests): Add test to
verify this is effective.
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/comp-cstr.el | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el index 97f8f4d5c40..65710b58c10 100644 --- a/lisp/emacs-lisp/comp-cstr.el +++ b/lisp/emacs-lisp/comp-cstr.el @@ -449,18 +449,20 @@ Return them as multiple value." (declare (debug (range-body)) (indent defun)) `(with-comp-cstr-accessors - (when-let ((r1 (range ,src1)) - (r2 (range ,src2))) - (let* ((l1 (comp-cstr-smallest-in-range r1)) - (l2 (comp-cstr-smallest-in-range r2)) - (h1 (comp-cstr-greatest-in-range r1)) - (h2 (comp-cstr-greatest-in-range r2))) - (setf (typeset ,dst) (when (cl-some (lambda (x) - (comp-subtype-p 'float x)) - (append (typeset src1) - (typeset src2))) - '(float)) - (range ,dst) ,@range-body))))) + (if (or (neg src1) (neg src2)) + (setf (typeset ,dst) '(number)) + (when-let ((r1 (range ,src1)) + (r2 (range ,src2))) + (let* ((l1 (comp-cstr-smallest-in-range r1)) + (l2 (comp-cstr-smallest-in-range r2)) + (h1 (comp-cstr-greatest-in-range r1)) + (h2 (comp-cstr-greatest-in-range r2))) + (setf (typeset ,dst) (when (cl-some (lambda (x) + (comp-subtype-p 'float x)) + (append (typeset src1) + (typeset src2))) + '(float)) + (range ,dst) ,@range-body)))))) (defun comp-cstr-add-2 (dst src1 src2) "Sum SRC1 and SRC2 into DST." |