https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81484
Bug ID: 81484 Summary: incorrect -Wint-in-bool-context warning Product: gcc Version: 7.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: arnd at linaro dot org Target Milestone: --- I came across a warning in the linux kernel with gcc-7.1.1: arch/x86/math-emu/reg_add_sub.c: In function 'FPU_add': arch/x86/math-emu/reg_add_sub.c:80:48: error: ?: using integer constants in boolean context [-Werror=int-in-bool-context] After analyzing it further, I reduced it to this test program, please compile with "gcc-7.1.1 -Wall -O2": #define signbyte(a) (((unsigned char *)(a))[9]) #define getsign(a) (signbyte(a) & 0x80) #define setsign(a,b) do { if (b) signbyte(a) |= 0x80; else signbyte(a) &= 0x7f; } while (0) #define CW_RC 0x0C00 #define RC_DOWN 0x0400 #define SIGN_POS 0u #define SIGN_NEG 0x80u int FPU_add(void *dest, int control_w) { /* a) correct code, bogus warning */ setsign(dest, ((control_w & CW_RC) != RC_DOWN) ? SIGN_POS : SIGN_NEG); /* b) false-positive warning */ setsign(dest, (control_w & CW_RC) != RC_DOWN ? SIGN_POS : SIGN_NEG); /* c) wrong code, no warning */ setsign(dest, (control_w & CW_RC) != (RC_DOWN ? SIGN_POS : SIGN_NEG)); return 0; } The warning we get is about case a), which as far as I can tell is written correctly and unambiguous, and should not trigger a warning. It appears that the compiler mistakes this for code that is written in a somewhat ambiguous way like the (still-correct) variant b) when the author actually meant to write it like c). The result is that we also get a false-positive warning for b) that makes a lot of sense, while the incorrect case c) is a false-negative here, as we don't get a warning.