Section 6.2 of the standard describes the relationships between types that are engendered by implicit conversions. Such implicit conversions are defined in OIL by coercions.
Implicit conversions between derived types can only be defined after the types themselves are defined. Thus coercions involving derived types must be components of the relevant OIL classes. These coercions are defined here as macros that are invoked as components of the classes defined in Section 4.1.1.
Certain operators require that the integral promotion be performed on their operand(s), and the result has the promoted type. These operators are therefore defined in terms of sets that include only promoted integer types:
A conditional can accept any scalar type. Thus we need a type key representing any scalar type:
Section 188.8.131.52 of the standard says that an lvalue that has type ``array of type'' is converted to an expression that has type ``pointer to type'' except when it is the operand of sizeof or the unary & operator, or is a character string literal used to initialize an array. A function designator of type ``function returning type'' is converted to an expression that has type `pointer to function returning type'' under similar circumstances:
Section 184.108.40.206 says that an expression occurs in a context where a void expression is required, its value or designator is discarded.
Section 220.127.116.11 of the standard describes the conversions among pointers. TypeIs_NULL represents an integral constant expression with the value 0, which can be converted to a pointer of any type.
CNulltoVoidPtr is required because it is possible to use an integral constant expression with the value 0 as a value of type void* directly, and CNulltoIntegral is required to allow an integral constant expression with the value 0 to be interpreted as an integral value rather than a null pointer.