On Wed, Feb 2, 2022 at 11:20 PM David Laight <David.Laight@xxxxxxxxxx> wrote: > > The type of the result depends on the type of the 2nd and 3rd arguments. > Not on the value of the first one. I am not talking about the first operand. The behavior of the conditional operator has a few cases. Since you mentioned promotions, it looked like you were thinking about what happens for the arithmetic types case, i.e. """If both the second and third operands have arithmetic type, the result type that would be determined by the usual arithmetic conversions, were they applied to those two operands, is the type of the result.""" which could lead to thinking that the expressions need to have the same type as you mentioned, but that is not true, and the arithmetic types case is not used in the macro either. The cases used are the null pointer constant vs. pointer and the pointer to void vs. pointer to object type. > It has nothing to with the condition, the compiler is trying to 'sort out' > a suitable return type. > > I suspect the mismatched pointer types might even be a gcc extension. That is why I said it does not fit the constraints of the operator. The standard does not describe what happens in such a case. Cheers, Miguel