Bitshift y promoción de enteros?

Normalmente, C requiere que los operandos de un operador binario sean promovidos al tipo de operando de mayor rango. Esto puede explotarse para evitar llenar el código con modelos detallados, por ejemplo:

if (x-48U<10) ...
y = x+0ULL << 40;

etc.

Sin embargo, he descubierto que, al menos con gcc, este comportamiento no funciona para los cambios de bits. Es decir.

int x = 1;
unsigned long long y = x << 32ULL;

Esperaría que el tipo de operando de la derecha haga que el operando de la izquierda sea promovido aunsigned long long para que el cambio tenga éxito. Pero en cambio, gcc imprime una advertencia:

warning: left shift count >= width of type

¿Está roto gcc, o el estándar hace alguna excepción a las reglas de promoción de tipo para bithifts?

Respuestas a la pregunta(2)

Su respuesta a la pregunta