Common Lisp the Language, 2nd Edition
X3J13 voted in January 1989 (ARRAY-TYPE-ELEMENT-TYPE-SEMANTICS) to add new functions by which a program can determine, in a given Common Lisp implementation, how that implementation will upgrade a type when constructing an array specialized to contain elements of that type, or a complex number specialized to contain parts of that type.
[Function]
upgraded-array-element-type type
A type specifier is returned, indicating the element type of the most specialized array representation capable of holding items of the specified argument type. The result is necessarily a supertype of the given type. Furthermore, if a type A is a subtype of type B, then (upgraded-array-element-type A) is a subtype of (upgraded-array-element-type B).
The manner in which an array element type is upgraded depends only on the element type as such and not on any other property of the array such as size, rank, adjustability, presence or absence of a fill pointer, or displacement.
Note that upgraded-array-element-type could be defined as
(defun upgraded-array-element-type (type) (array-element-type (make-array 0 :element-type type)))
but this definition has the disadvantage of allocating an array and then immediately discarding it. The clever implementor surely can conjure up a more practical approach.
[Function]
upgraded-complex-part-type type
A type specifier is returned, indicating the element type
of the most specialized complex number representation capable of having
parts of the specified argument type.
The result is necessarily a supertype of the given type.
Furthermore, if a type A is a subtype of type B, then
(upgraded-complex-part-type A) is a subtype of
(upgraded-complex-part-type B).