On Nov 7, 2010, at 4:13 PM, Jakub Zawadzki wrote:
> On Sun, Nov 07, 2010 at 03:37:36PM -0500, Hadriel Kaplan wrote:
>
> I really don't want to force it bigger than int, I just want to make it unsigned.
>
> cause:
> (gdb) call /x (unsigned long long) (0xdead << 16)
> $1 = 0xffffffffdead0000
> (gdb) call /x (unsigned long long) (0xdeadU << 16)
> $2 = 0xdead0000
>
> and I'm afraid in your case (VENDOR_FOO << 16) is sign extended to uint64_t.
> (btw. you can check it using disassembly)
Ahhh - yup, you're right! That did the trick.
>> gcc errors that the switch's case statement is not an integer... and apparently ISO C agrees with it: switch/case is defined to use an int size
>
> Well mine[1] version of C99 standard speaks only about *integer constants*, and unsigned long long constant is still integer one.
> Can't find information about int size.
>
> gcc-4.4.4 compiles & run attached test without problem (both on -m32 -m64)
> Can you try it?
Yup, worked.
> [1] http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
Right, but doesn't section 6.8.4.2 say it? Oh wait, you mean it says integer but it's a long long integer so it's ok. Weird... I know I got a compiler warning when I tried forcing it originally. Maybe I was using a variable after all instead of a constant. I'm usually good about not doing that, but I must've 'cause it's compiling fine now... spent too long pulling my hair out trying to figure out why my code wasn't working when I copied Cace Technology's example, to remember all the things I tried.
Thanks!
So maybe a comment should be added to sminmpec.h to do that for anyone adding VENDOR_xxx to the list?
-hadriel