https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87951
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Vitali from comment #0) > If a function has a single switch statement that handles all enum values & > returns a value GCC will warn about the function not returning a value > whereas clang does not. GCC requires an explicit __builtin_unreachable() > annotation after the switch. As of C++17 it seems to now be undefined > behaviour rather than unspecified behaviour for an enum to have a value > that's not enumerated. No, that's not what the defect report says. I wish this myth would die. Outside the range of the enumerated values does not mean not enumerated. Given enum E { e0=0, e10=7 } there is nothing undefined about E(1) or E(4). > http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1766 > > > cat test.c > > enum Enum { > A, > B, > }; > > int CoverMyBases(enum Enum x) { > switch (x) { > case A: > return 1; > case B: > return 0; > } > } > > int main(int argc, const char **argv) { > CoverMyBases(A); > CoverMyBases(B); > return 0; > } > > > g++-8 -Wall --std=c++17 test.c > > test.c: In function 'CoverMyBases': > test.c:16:1: warning: control reaches end of non-void function > [-Wreturn-type] > } > ^ This is what -fstrict-enums is for.