Re: [PATCH 03/10] fast-export: use value from correct enum
- From
Jeff King <peff@peff.net>
- Date
- Nov 12, 2018, 11:31 UTC
- Message-ID
- <20181112113123.GA470@sigill.intra.peff.net>
- In-Reply-To
- <87va532x5i.fsf@evledraar.gmail.com>
On Sun, Nov 11, 2018 at 09:10:17PM +0100, Ævar Arnfjörð Bjarmason wrote:
Show 25 quoted lines
> > This is a good argument for naming these SIGNED_TAG_ABORT, etc. But this
> > is obviously an improvement in the meantime.
>
> In C enum values aren't the types of the enum, but I'd thought someone
> would have added a warning for this:
>
> #include <stdio.h>
>
> enum { A, B } foo = A;
> enum { C, D } bar = C;
>
> int main(void)
> {
> switch (foo) {
> case C:
> puts("A");
> break;
> case B:
> puts("B");
> break;
> }
> }
>
> But none of the 4 C compilers (gcc, clang, suncc & xlc) I have warn
> about it. Good to know.There is -Wenum-compare, but it does not seem to catch this (and is enabled by -Wall). It (gcc, at least) does catch:
enum foo { A, B };
enum bar { C, D }; int f(enum foo x)
{
return x == C;
}but converting that equality check to:
switch (x) {
case C:
return 1;
default:
return 0;
}is not (which is essentially the same as your snippet). So I think the bug / feature request is to have -Wenum-compare apply to switch statements.
Clang has -Wenum-compare-switch, but I cannot seem to get it to complain about even the "==" version using -Wenum-compare. Not sure if it's buggy, or if I'm holding it wrong. This patch seems to be what we want:
https://reviews.llvm.org/D36407
-Peff