Uso extraño de operador condicional en Linux

En el kernel de Linux 3.0.4, mm / filemap.c tiene esta línea de código:

retval = retval ?: desc.error;

He intentado compilar un caso de prueba mínimo similar con gcc -Wall y no recibo ninguna advertencia; el comportamiento parece idéntico a:

retval = retval ? retval : desc.error;

Mirando el estándar C99, no puedo entender qué describe formalmente este comportamiento. ¿Por qué está bien esto?

Respuestas a la pregunta(4)

Su respuesta a la pregunta