https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87613
Martin Liška <marxin at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |RESOLVED Resolution|--- |WORKSFORME --- Comment #2 from Martin Liška <marxin at gcc dot gnu.org> --- Yes, it was fixed by Jakub in GCC 8 in r247538. As Richi said, to suppress the warning, please use __builtin_unreachable () like: template<int> int foo(); typedef int (*int_fun)(); inline int_fun get_fun(unsigned int x) { switch(x&7) { case 0: return foo<0>; case 1: return foo<1>; case 2: return foo<2>; case 3: return foo<3>; case 4: return foo<4>; case 5: return foo<5>; case 6: return foo<6>; case 7: return foo<7>; default: __builtin_unreachable (); // never happens } // alternative to default case: // return 0; // never happens } int bla(unsigned int x) { return get_fun(x)(); }