This is permitted in GNU as an obscure extension to C
5.7 Conditionals with Omitted Operands
The middle operand in a conditional
expression may be omitted. Then if the
first operand is nonzero, its value is
the value of the conditional
expression.
Therefore, the expression
x ? : y
has the value of x if that is nonzero;
otherwise, the value of y.
This example is perfectly equivalent
to
x ? x : y
In this simple case, the ability to
omit the middle operand is not
especially useful. When it becomes
useful is when the first operand does,
or may (if it is a macro argument),
contain a side effect. Then repeating
the operand in the middle would
perform the side effect twice.
Omitting the middle operand uses the
value already computed without the
undesirable effects of recomputing it.
As you can probably guess, avoiding this is recommended for readability and portability reasons. I'm honestly surprised to see such a grammar-incompatible extension to C.