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

Reply via email to