(loop for (arg next) on args
while next
do
- (let ((lvar-type (lvar-type arg)))
- (unless (or (csubtypep cons-type lvar-type)
- (csubtypep null-type lvar-type))
- (assert-lvar-type arg list-type
- (lexenv-policy *lexenv*))
- (return *empty-type*))))
+ (when (eq (type-intersection (lvar-type arg) list-type)
+ *empty-type*)
+ (assert-lvar-type arg list-type
+ (lexenv-policy *lexenv*))
+ (return *empty-type*)))
(loop with all-nil = t
for (arg next) on args
for lvar-type = (lvar-type arg)
do
(cond
;; Cons in the middle guarantees the result will be a cons
- ((csubtypep lvar-type cons-type)
+ ((not (csubtypep null-type lvar-type))
(return cons-type))
;; If all but the last are NIL the type of the last arg
;; can be used
(lambda (x y) (nconc x (the list y) x)) t
(lambda (x y) (nconc (the atom x) y)) t
(lambda (x y) (nconc (the (or null (eql 10)) x) y)) t
- (lambda (x y) (nconc (the (or cons vector) x) y)) t
+ (lambda (x y) (nconc (the (or cons vector) x) y)) cons
(lambda (x y) (nconc (the sequence x) y)) t
- (lambda (x y) (print (length y)) (append x y)) sequence)))
+ (lambda (x y) (print (length y)) (append x y)) sequence
+ (lambda (x y) (print (length y)) (append x y)) sequence
+ (lambda (x y) (append (the (member (a) (b)) x) y)) cons
+ (lambda (x y) (append (the (member (a) (b) c) x) y)) cons
+ (lambda (x y) (append (the (member (a) (b) nil) x) y)) t)))
(loop for (function result-type) on test-cases by #'cddr
do (assert (equal (car (cdaddr (sb-kernel:%simple-fun-type
(compile nil function))))