summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/comp-cstr.el
diff options
context:
space:
mode:
authorAndrea Corallo <akrl@sdf.org>2020-12-05 23:42:25 +0100
committerAndrea Corallo <akrl@sdf.org>2020-12-06 18:02:18 +0100
commitac40a60696322cd92f37fcddda97ae9c00226bf8 (patch)
tree0ad146e7e912e967fa947dcd457266a080eacbc9 /lisp/emacs-lisp/comp-cstr.el
parent09ec39e35213f92ce297dfed7a42af56b5e2b693 (diff)
downloademacs-ac40a60696322cd92f37fcddda97ae9c00226bf8.tar.gz
emacs-ac40a60696322cd92f37fcddda97ae9c00226bf8.tar.bz2
emacs-ac40a60696322cd92f37fcddda97ae9c00226bf8.zip
Couple of `comp-cstr-union-1-no-mem' improvements for mixed neg pos union
* lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem): Generalize disjoint pos types vs neg values conditions. (comp-cstr-union-1-no-mem): Do not propagate ranges when we are already returning integer as generic type. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add corresponding tests.
Diffstat (limited to 'lisp/emacs-lisp/comp-cstr.el')
-rw-r--r--lisp/emacs-lisp/comp-cstr.el32
1 files changed, 23 insertions, 9 deletions
diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el
index bb63ff3e961..d4e47cf302f 100644
--- a/lisp/emacs-lisp/comp-cstr.el
+++ b/lisp/emacs-lisp/comp-cstr.el
@@ -383,6 +383,23 @@ DST is returned."
(neg dst) nil)
(cl-return-from comp-cstr-union-1-no-mem dst))
+ ;; Verify disjoint condition between positive types and
+ ;; negative types coming from values, in case give-up.
+ (let ((neg-value-types (nconc (mapcar #'type-of (valset neg))
+ (when (range neg)
+ '(integer)))))
+ (when (cl-some (lambda (x)
+ (cl-some (lambda (y)
+ (and (not (eq y x))
+ (comp-subtype-p y x)))
+ neg-value-types))
+ (typeset pos))
+ (setf (typeset dst) '(t)
+ (valset dst) ()
+ (range dst) ()
+ (neg dst) nil)
+ (cl-return-from comp-cstr-union-1-no-mem dst)))
+
;; Value propagation.
(cond
((and (valset pos) (valset neg)
@@ -401,12 +418,8 @@ DST is returned."
;; Range propagation
(if (and range
(or (range pos)
- (range neg))
- (cl-notany (lambda (x)
- (comp-subtype-p 'integer x))
- (typeset pos)))
- (if (or (valset neg)
- (typeset neg))
+ (range neg)))
+ (if (or (valset neg) (typeset neg))
(setf (range neg)
(if (memq 'integer (typeset neg))
(comp-range-negation (range pos))
@@ -416,9 +429,10 @@ DST is returned."
;; When possibile do not return a negated cstr.
(setf (typeset dst) (typeset pos)
(valset dst) (valset pos)
- (range dst) (comp-range-union
- (comp-range-negation (range neg))
- (range pos))
+ (range dst) (unless (memq 'integer (typeset dst))
+ (comp-range-union
+ (comp-range-negation (range neg))
+ (range pos)))
(neg dst) nil)
(cl-return-from comp-cstr-union-1-no-mem dst))
(setf (range neg) ()))