https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65452
--- Comment #9 from Marek Polacek <mpolacek at gcc dot gnu.org> --- Testcase: #include <string.h> #define STR1 "str" #define STR2 "str" #define S1 (s) #define S2 (s) int f (const char *s) { int r = 0; r += strcmp (s, s) == 0; r += __builtin_strcmp (s, s) == 0; r += strcmp ("s", "s") == 0; r += __builtin_strcmp ("s", "s") == 0; r += strcmp ((const char *) 0, "s") == 0; r += __builtin_strcmp ((const char *) 0, "s") == 0; r += strcmp ((const char *) 0, (const char *) 0) == 0; r += __builtin_strcmp ((const char *) 0, (const char *) 0) == 0; r += strcmp (STR1, STR2) == 0; r += __builtin_strcmp (STR1, STR2) == 0; r += strcmp (STR1, "str") == 0; r += __builtin_strcmp (STR1, "str") == 0; r += strcmp ("str", STR2) == 0; r += __builtin_strcmp ("str", STR2) == 0; r += strcmp (S1, S2) == 0; r += __builtin_strcmp (S1, S2) == 0; r += strcmp (S1, s) == 0; r += __builtin_strcmp (S1, s) == 0; r += strcmp (s, S2) == 0; r += __builtin_strcmp (s, S2) == 0; return r; }