`(single-float ,low ,high))
;;; an index into an integer
-(sb!xc:deftype bit-index () `(integer 0 ,most-positive-fixnum))
+(sb!xc:deftype bit-index () `(integer 0 ,sb!xc:most-positive-fixnum))
;;; worst-case values for float attributes
(sb!xc:deftype float-exponent ()
#!-long-float `(integer 0 ,sb!vm:double-float-digits)
#!+long-float `(integer 0 ,sb!vm:long-float-digits))
(sb!xc:deftype float-radix () '(integer 2 2))
+(sb!xc:deftype float-int-exponent ()
+ #!-long-float 'double-float-int-exponent
+ #!+long-float 'long-float-int-exponent)
;;; a code for BOOLE
(sb!xc:deftype boole-code () '(unsigned-byte 4))
(type-specifier (array-type-specialized-element-type
(specifier-type `(array ,spec))))))
+(defun sb!xc:upgraded-complex-part-type (spec &optional environment)
+ #!+sb-doc
+ "Return the element type of the most specialized COMPLEX number type that
+ can hold parts of type SPEC."
+ (declare (ignore environment))
+ (if (unknown-type-p (specifier-type spec))
+ (error "undefined type: ~S" spec)
+ (let ((ctype (specifier-type `(complex ,spec))))
+ (cond
+ ((eq ctype *empty-type*) '(eql 0))
+ ((csubtypep ctype (specifier-type '(complex single-float)))
+ 'single-float)
+ ((csubtypep ctype (specifier-type '(complex double-float)))
+ 'double-float)
+ #!+long-float
+ ((csubtypep ctype (specifier-type '(complex long-float)))
+ 'long-float)
+ ((csubtypep ctype (specifier-type '(complex rational)))
+ 'rational)
+ (t 'real)))))
+
;;; Return the most specific integer type that can be quickly checked that
;;; includes the given type.
(defun containing-integer-type (subtype)