https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69768
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- if ((code1 == STRING_CST && !integer_zerop (arg2.value)) || (code2 == STRING_CST && !integer_zerop (arg1.value))) warning_at (location, OPT_Waddress, "comparison with string literal results in unspecified behavior"); (gdb) p code1 $1 = STRING_CST (gdb) p code2 $2 = ERROR_MARK (gdb) p debug_generic_expr (arg1.value) (char *) "Should not call this function" $3 = void (gdb) p debug_generic_expr (arg2.value) 0B (gdb) p integer_zerop (arg2.value) $6 = 0 huh? Ah. (gdb) p debug_tree (arg2.value) <nop_expr 0x7ffff69b2000 type <pointer_type 0x7ffff68adbd0 type <integer_type 0x7ffff688f5e8 char public string-flag QI size <integer_cst 0x7ffff688bd98 constant 8> unit size <integer_cst 0x7ffff688bdb0 constant 1> align 8 symtab 0 alias set -1 canonical type 0x7ffff688f5e8 precision 8 min <integer_cst 0x7ffff688bde0 -128> max <integer_cst 0x7ffff688be10 127> pointer_to_this <pointer_type 0x7ffff68adbd0>> public unsigned DI size <integer_cst 0x7ffff688bca8 constant 64> unit size <integer_cst 0x7ffff688bcc0 constant 8> align 64 symtab 0 alias set -1 canonical type 0x7ffff68adbd0 reference_to_this <reference_type 0x7ffff698d7e0>> constant arg 0 <integer_cst 0x7ffff699f2e8 type <pointer_type 0x7ffff68adbd0> constant 0> t.c:4:39 start: t.c:4:39 finish: t.c:4:58> some spurious NOP_EXPR around the constant. Why's that?