On Wed, Feb 2, 2022 at 3:01 PM Miguel Ojeda <miguel.ojeda.sandonis@xxxxxxxxx> wrote: > > 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. Since this patch is a rephrasing of https://stackoverflow.com/a/49481218, I think the relevant citation from the C standard is below: ``` The key here is that the conditional operator returns a different type depending on whether one of the operands is a null pointer constant (6.5.15.6): [...] if one operand is a null pointer constant, the result has the type of the other operand; otherwise, one operand is a pointer to void or a qualified version of void, in which case the result type is a pointer to an appropriately qualified version of void. So, if x was an integer constant expression, then the second operand is a null pointer constant and therefore the type of the expression is the type of the third operand, which is a pointer to int. ``` -- Thanks, ~Nick Desaulniers