+(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))
+ (let ((type (specifier-type spec)))
+ (cond
+ ((eq type *empty-type*) nil)
+ ((unknown-type-p type) (error "undefined type: ~S" spec))
+ (t
+ (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)))))))
+