http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59934
--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Now, if we want to "fix" this on the expmed.h side, either: --- gcc/expmed.h 2014-01-03 11:40:57.228320531 +0100 +++ gcc/expmed.h 2014-01-24 18:30:12.513908749 +0100 @@ -221,9 +221,11 @@ expmed_mode_index (enum machine_mode mod case MODE_INT: return mode - MIN_MODE_INT; case MODE_PARTIAL_INT: - return mode - MIN_MODE_PARTIAL_INT + NUM_MODE_INT; + return (MIN_MODE_PARTIAL_INT == VOIDmode + ? 0 : mode - MIN_MODE_PARTIAL_INT + NUM_MODE_INT); case MODE_VECTOR_INT: - return mode - MIN_MODE_VECTOR_INT + NUM_MODE_IP_INT; + return (MIN_MODE_VECTOR_INT == VOIDmode + ? mode - MIN_MODE_VECTOR_INT + NUM_MODE_IP_INT); default: gcc_unreachable (); } or --- gcc/expmed.h 2014-01-03 11:40:57.228320531 +0100 +++ gcc/expmed.h 2014-01-24 18:34:01.806725352 +0100 @@ -221,8 +221,10 @@ expmed_mode_index (enum machine_mode mod case MODE_INT: return mode - MIN_MODE_INT; case MODE_PARTIAL_INT: + gcc_assert (MIN_MODE_PARTIAL_INT != VOIDmode); return mode - MIN_MODE_PARTIAL_INT + NUM_MODE_INT; case MODE_VECTOR_INT: + gcc_assert (MIN_MODE_VECTOR_INT != VOIDmode); return mode - MIN_MODE_VECTOR_INT + NUM_MODE_IP_INT; default: gcc_unreachable (); should be enough to explain to the compiler that those cases really can't happen and let gcc not emit the warnings.