On Sun, Nov 11, 2018 at 09:10:17PM +0100, Ævar Arnfjörð Bjarmason wrote: > > 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