¿Están las declaraciones compuestas (bloques) rodeadas por expresiones parens en ANSI C?

Navegando por las fuentes del kernel de Linux que encontréalguna pieza de código donde un bloque de declaraciones entre paréntesis se trata como una expresióna la lisp (o ML), es decir, una expresión cuyo valor es el valor de la última declaración.

Por ejemplo:

int a = ({
    int i;
    int t = 1;
    for (i = 2; i<5; i++) {
        t*=i;
    }
    t;
});

He estado mirando elANSI C gramática tratando de averiguar cómo encajaría este código en el árbol de análisis, pero no he tenido éxito.

Entonces, ¿alguien sabe si este comportamiento es obligatorio por la norma o es solo una peculiaridad de GCC?

Actualizar: He intentado con el indicador -pedantic y el compilador ahora me da una advertencia:

warning: ISO C forbids braced-groups within expressions

Respuestas a la pregunta(2)

Su respuesta a la pregunta