diff --git a/lisp/emacs-lisp/comp-cstr.el b/lisp/emacs-lisp/comp-cstr.el index 73d445eb3f4..5a3b7b48cc4 100644 --- a/lisp/emacs-lisp/comp-cstr.el +++ b/lisp/emacs-lisp/comp-cstr.el @@ -941,6 +941,17 @@ Non memoized version of `comp-cstr-intersection-no-mem'." (null (neg cstr)) (equal (typeset cstr) '(cons))))) +(define-inline comp-cstr-type-p (cstr type) + "Return t if CSTR is certainly of type TYPE." + (if-let ((pred (get type 'cl-deftype-satisfies))) + (with-comp-cstr-accessors + (and (null (range cstr)) + (null (neg cstr)) + (and (or (null (typeset cstr)) + (equal (typeset cstr) `(,type))) + (cl-every pred (valset cstr))))) + (error "Unknown predicate for type %s" type))) + ;; Move to comp.el? (defsubst comp-cstr-cl-tag-p (cstr) "Return non-nil if CSTR is a CL tag."