https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65412
--- Comment #4 from Andrew Pinski <pinskia at gcc dot gnu.org> --- clang decides at 4 to change it to a switch statement while GCC takes a few extra ifs to change it. Again this is heuristics at work. #define B(y) void f##y(void); #define B10(y) B(y##0) B(y##1) B(y##2) \ B(y##3) B(y##4) B(y##5) \ B(y##6) B(y##7) B(y##8) \ B(y##9) B10(1) #define A(y) else if (x == y) f##y(); void f10(int x) { if (0) ; A(11) A(12) A(13) A(14) }