On 6 February 2015 at 16:20, Richard Henderson <r...@twiddle.net> wrote: > It should be enough to simply add the unsigned suffix to the integers as they > are, forcing the underlying type to be unsigned.
I can't see anything in the C99 spec that justifies this as a fix... In fact, 6.7.2.2 para 3 says "The identifiers in an enumerator list are declared as constants that have type int", which sounds to me like it means "if you have enum { foo = ..., }; then 'foo' must have (signed) integer type even if the representation of the enum type is unsigned". And indeed: e104462:trusty:qemu$ cat /tmp/zz9.c enum { foo = 1U }; int main(void) { return foo << 31; } e104462:trusty:qemu$ clang -fsanitize=undefined -Wall /tmp/zz9.c -o /tmp/zz9 e104462:trusty:qemu$ /tmp/zz9 /tmp/zz9.c:5:16: runtime error: left shift of 1 by 31 places cannot be represented in type 'int' -- PMM