Bitshift and integer promotion?

Viewed 7446

Normally, C requires that a binary operator's operands are promoted to the type of the higher-ranking operand. This can be exploited to avoid filling code with verbose casts, for example:

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

etc.

However, I've found that, at least with gcc, this behavior does not work for bitshifts. I.e.

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

I would expect the type of the right-hand operand to cause the left-hand operand to be promoted to unsigned long long so that the shift succeeds. But instead, gcc prints a warning:

warning: left shift count >= width of type

Is gcc broken, or does the standard make some exception to the type promotion rules for bitshifts?

2 Answers
Related