Странное использование условного оператора в Linux

В ядре Linux 3.0.4 файл mm / filemap.c содержит следующую строку кода:

retval = retval ?: desc.error;

Я попытался скомпилировать аналогичный минимальный тестовый пример с помощью gcc -Wall и не получил никаких предупреждений; поведение кажется идентичным

retval = retval ? retval : desc.error;

Глядя на стандарт C99, я не могу понять, что формально описывает это поведение. Почему это нормально?