]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix `comp-cstr-intersection-no-hashcons' for negated result cstr
authorAndrea Corallo <akrl@sdf.org>
Sat, 6 Mar 2021 21:36:50 +0000 (22:36 +0100)
committerAndrea Corallo <akrl@sdf.org>
Sat, 6 Mar 2021 22:17:14 +0000 (23:17 +0100)
* lisp/emacs-lisp/comp-cstr.el
(comp-cstr-intersection-no-hashcons): When negated and
necessary relax dst to t.
* test/src/comp-tests.el (comp-tests-type-spec-tests): Add a test.

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

index d6423efa0d6bbb0dc4af862fbb4851f864b1e591..4397a914981bec2d678a46bc4ecb8bd42afd7839 100644 (file)
@@ -1001,20 +1001,26 @@ promoted to their types.
 DST is returned."
   (with-comp-cstr-accessors
     (apply #'comp-cstr-intersection dst srcs)
-    (let (strip-values strip-types)
-      (cl-loop for v in (valset dst)
-               unless (or (symbolp v)
-                          (fixnump v))
-                 do (push v strip-values)
-                    (push (type-of v) strip-types))
-      (when strip-values
-        (setf (typeset dst) (comp-union-typesets (typeset dst) strip-types)
-              (valset dst) (cl-set-difference (valset dst) strip-values)))
-      (cl-loop for (l . h) in (range dst)
-               when (or (bignump l) (bignump h))
+    (if (and (neg dst)
+             (valset dst)
+             (cl-notevery #'symbolp (valset dst)))
+        (setf (valset dst) ()
+              (typeset dst) '(t)
+              (range dst) ()
+              (neg dst) nil)
+      (let (strip-values strip-types)
+        (cl-loop for v in (valset dst)
+                 unless (symbolp v)
+                   do (push v strip-values)
+                      (push (type-of v) strip-types))
+        (when strip-values
+          (setf (typeset dst) (comp-union-typesets (typeset dst) strip-types)
+                (valset dst) (cl-set-difference (valset dst) strip-values)))
+        (cl-loop for (l . h) in (range dst)
+                 when (or (bignump l) (bignump h))
                  do (setf (range dst) '((- . +)))
-                    (cl-return))
-      dst)))
+                    (cl-return))))
+    dst))
 
 (defun comp-cstr-intersection-make (&rest srcs)
   "Combine SRCS by intersection set operation and return a new constraint."
index cd1c2e0735e74e8475320ec2ed44af393edafad0..f60e4ab04979fac00861785b1d43c19aa71cae04 100644 (file)
@@ -1340,7 +1340,14 @@ Return a list of results."
          (unless (eql x -0.0)
            (error ""))
          x)
-       float)))
+       float)
+
+      ;; 73
+      ((defun comp-tests-ret-type-spec-f (x)
+         (when (eql x 1.0)
+          (error ""))
+         x)
+       t)))
 
   (defun comp-tests-define-type-spec-test (number x)
     `(comp-deftest ,(intern (format "ret-type-spec-%d" number)) ()