------- Comment #3 from roger at eyesopen dot com 2006-07-08 14:31 ------- I tried fixing this bug, only to discover why things are exactly as they are.
The short answer is that GCC will warn about the example code if you specify the -Wswitch-enum command line option. Specifying -Wall implies the weaker -Wswitch, which intentionally disables the checking of enumeration literals in switch statements. But why would anyone want to disable warning for the example code, I thought to myself, until bootstrapping GCC itself discovered a large number of cases identical to the one reported. Internally, GCC itself uses an enumeration called tree_code that tracks the different types of node of GCC's abstract syntax tree (AST). However, numerous front-ends, supplement this enumeration with their own front-end specific tree codes, for example, COMPOUND_LITERAL_EXPR. Hence, the various GCC front-ends are littered with source code that looks like: switch (TREE_CODE (t)) { case COMPOUND_LITERAL_EXPR: ... where the case value isn't one of the values of the original enum tree_code enumeration. Similar problems appeared in dwarf2out.c and other GCC source files. At first I started changing things to "switch ((int) TREE_CODE (t))" to silence the warning, but quickly became overwhelmed by the number of source files that needed updating. Hence, the current status quo. GCC uses the "default: break;" idiom to indicate which switch statements may be bending the rules, to turn off this warning with the default -Wall/-Wswitch used during bootstrap. Well written user code, on the other hand, should probably always use -Wswitch-enum. If you read the documentation of -Wswitch vs. -Wswitch-enum, you'll see that the disabling of these warnings when a default case is specified, is a curious "feature", purely to aid GCC to compile itself. As Andrew Pinskia points out in comment #2, it's valid C/C++ so shouldn't warrant an immediate warning, so the explicit -Wswitch-enum, requesting stricter checking seems reasonable. I hope this helps, and the -Wswitch-enum fulfils this enhancement request. -- roger at eyesopen dot com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25995