https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63321
--- Comment #8 from Oleg Endo <olegendo at gcc dot gnu.org> --- (In reply to Oleg Endo from comment #1) > > void test2_2 (unsigned int x, unsigned int* y) > { > unsigned int xx = x >> 1; > unsigned int p = x & 1; > if (p != 0) > foo (xx); > } > And of course also in the opposite direction: void test4_2 (unsigned int x) { if (x & (1 << 31)) ((void(*)(void))(x << 1)) (); }