0.7.2.7:
[sbcl.git] / src / code / early-type.lisp
index 6dfad22..2eea097 100644 (file)
 ;;; the original type spec.
 (defstruct (hairy-type (:include ctype
                                 (class-info (type-class-or-lose 'hairy))
-                                (enumerable t))
+                                (enumerable t)
+                                (might-contain-other-types? t))
                       (:copier nil)
                       #!+cmu (:pure nil))
-  ;; the Common Lisp type-specifier
+  ;; the Common Lisp type-specifier of the type we represent
   (specifier nil :type t))
 
 (!define-type-class hairy)
 
 ;;; A COMPOUND-TYPE is a type defined out of a set of types, the
 ;;; common parent of UNION-TYPE and INTERSECTION-TYPE.
-(defstruct (compound-type (:include ctype)
+(defstruct (compound-type (:include ctype
+                                   (might-contain-other-types? t))
                          (:constructor nil)
                          (:copier nil))
   (types nil :type list :read-only t))
       type))
 
 ;;; A CONS-TYPE is used to represent a CONS type.
-(defstruct (cons-type (:include ctype (:class-info (type-class-or-lose 'cons)))
+(defstruct (cons-type (:include ctype (class-info (type-class-or-lose 'cons)))
                      (:constructor
                       ;; ANSI says that for CAR and CDR subtype
                       ;; specifiers '* is equivalent to T. In order
 ;;; type is defined (or redefined).
 (defun-cached (values-specifier-type
               :hash-function (lambda (x)
-                               ;; FIXME: The THE FIXNUM stuff is
-                               ;; redundant in SBCL (or modern CMU
-                               ;; CL) because of type inference.
-                               (the fixnum
-                                    (logand (the fixnum (sxhash x))
-                                            #x3FF)))
+                                (logand (sxhash x) #x3FF))
               :hash-bits 10
               :init-wrapper !cold-init-forms)
              ((orig eq))
                     (funcall fun lspec))
                    ((or (and (consp spec) (symbolp (car spec)))
                         (symbolp spec))
-                    (when *type-system-initialized*
+                    (when (and *type-system-initialized*
+                                (not (eq (info :type :kind spec)
+                                         :forthcoming-defclass-type)))
                       (signal 'parse-unknown-type :specifier spec))
                     ;; (The RETURN-FROM here inhibits caching.)
                     (return-from values-specifier-type
                     (error "bad thing to be a type specifier: ~S"
                            spec))))))))))
 
-;;; Like VALUES-SPECIFIER-TYPE, except that we guarantee to never
-;;; return a VALUES type.
+;;; This is like VALUES-SPECIFIER-TYPE, except that we guarantee to
+;;; never return a VALUES type.
 (defun specifier-type (x)
   (let ((res (values-specifier-type x)))
     (when (values-type-p res)