https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69768
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Seems this happens during parsing when the arguments are still not folded. So, the question is what we want to achieve. static int e; extern void __assert_fail (); int foo () { ("Should not call this function" != (char *) ((void *)0)) ? (void) (0) : __assert_fail (); ("Should not call this function" != (char *) ((void *)(10 - 10))) ? (void) (0) : __assert_fail (); ("Should not call this function" != (char *) ((void *)(&e - &e))) ? (void) (0) : __assert_fail (); return 0; } GCC 5 warns only in the last case. Either calling integer_zerop on tree_strip_nop_conversions (arg?.value) instead of arg?.value itself can be enough, or we need to c_fully_fold it first. And the warning is even for C++, so for C++ FE we need similar changes.