]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix missing negation handling in a bunch of predicates
authorAndrea Corallo <akrl@sdf.org>
Tue, 29 Dec 2020 16:39:15 +0000 (17:39 +0100)
committerAndrea Corallo <akrl@sdf.org>
Tue, 29 Dec 2020 16:49:30 +0000 (17:49 +0100)
* lisp/emacs-lisp/comp.el (comp-mvar-fixnum-p)
(comp-mvar-symbol-p, comp-mvar-cons-p): Consider neg slot.
* test/src/comp-tests.el (comp-test-not-cons): New test.
* test/src/comp-test-funcs.el (comp-test-not-cons-f): New
function.

lisp/emacs-lisp/comp.el
test/src/comp-test-funcs.el
test/src/comp-tests.el

index b885ff88411d42444d9464e124e7dac3790611fd..bf266256f707c4fc50e09168cdb3cba2052d436b 100644 (file)
@@ -538,6 +538,8 @@ CFG is mutated by a pass.")
                  (integerp high)
                  (= low high))))))))
 
+;; FIXME move these into cstr?
+
 (defun comp-mvar-value (mvar)
   "Return the constant value of MVAR.
 `comp-mvar-value-vld-p' *must* be satisfied before calling
@@ -556,18 +558,20 @@ CFG is mutated by a pass.")
 
 (defun comp-mvar-fixnum-p (mvar)
   "Return t if MVAR is certainly a fixnum."
-  (when-let (range (comp-mvar-range mvar))
-    (let* ((low (caar range))
-           (high (cdar (last range))))
-      (unless (or (eq low '-)
-                  (< low most-negative-fixnum)
-                  (eq high '+)
-                  (> high most-positive-fixnum))
-        t))))
+  (when (null (comp-mvar-neg mvar))
+    (when-let (range (comp-mvar-range mvar))
+      (let* ((low (caar range))
+             (high (cdar (last range))))
+        (unless (or (eq low '-)
+                    (< low most-negative-fixnum)
+                    (eq high '+)
+                    (> high most-positive-fixnum))
+          t)))))
 
 (defun comp-mvar-symbol-p (mvar)
   "Return t if MVAR is certainly a symbol."
   (and (null (comp-mvar-range mvar))
+       (null (comp-mvar-neg mvar))
        (or (and (null (comp-mvar-valset mvar))
                 (equal (comp-mvar-typeset mvar) '(symbol)))
            (and (or (null (comp-mvar-typeset mvar))
@@ -578,6 +582,7 @@ CFG is mutated by a pass.")
   "Return t if MVAR is certainly a cons."
   (and (null (comp-mvar-valset mvar))
        (null (comp-mvar-range mvar))
+       (null (comp-mvar-neg mvar))
        (equal (comp-mvar-typeset mvar) '(cons))))
 
 (defun comp-mvar-type-hint-match-p (mvar type-hint)
index 7731e6547b172849ddd541da930f7fe9b4f0bb49..49e80763beeb069d331cc8e7f9436eba0d123c62 100644 (file)
          (setq x (1+ x)))))
     res))
 
+(defun comp-test-not-cons-f (x)
+  ;; Reduced from `cl-copy-list'.
+  (if (consp x)
+      (print x)
+    (car x)))
+
 \f
 ;;;;;;;;;;;;;;;;;;;;
 ;; Tromey's tests ;;
index 240af102ec42e87d7ffad527d39fed66878bf07f..4546eccb622e8773ebec9a822a2c9d175e58428f 100644 (file)
@@ -479,6 +479,9 @@ https://lists.gnu.org/archive/html/bug-gnu-emacs/2020-03/msg00914.html."
   "Check cond-rw does not break target blocks with multiple predecessor."
   (should (null (comp-test-cond-rw-1-2-f))))
 
+(comp-deftest comp-test-not-cons ()
+  (should-not (comp-test-not-cons-f nil)))
+
 \f
 ;;;;;;;;;;;;;;;;;;;;;
 ;; Tromey's tests. ;;