On 18 September 2017 at 18:55, John Snow <js...@redhat.com> wrote: > On 09/16/2017 10:34 AM, Peter Maydell wrote: >> Hi; I'm afraid this doesn't build with clang: >> >> /home/petmay01/linaro/qemu-for-merges/hw/ide/core.c:70:15: error: >> comparison of unsigned enum expression >= 0 is always true >> [-Werror,-Wtautological-compare] >> if (enval >= 0 && enval < IDE_DMA__COUNT) { >> ~~~~~ ^ ~ >> 1 error generated. >> >> (It's impdef whether an enum with all positive values is >> a signed type or unsigned type, so just deleting the >> comparison against 0 would also be wrong...)
> Huh, impdef in the general case, but is it undefined for gnu99? I'm > wondering why Clang can be so certain about this comparison being > useless. Is this a Clang "bug"? My guess is that clang as an implementation picks unsigned in this case, that it then effectively lowers all the enums to just being integer arithmetic, and then the warning pass coming along later doesn't know that the unsigned thing it's comparing is an enum. I think you could argue that it would at least be helpful if clang didn't warn about comparisons that only happen to be useless for this particular platform/impdef choice but are useful for the same code compiled with a different compiler. thanks -- PMM