https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104948
--- Comment #9 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to dagelf from comment #8) > Makes perfect sense now. && is "logical" in that it can only produce a bool, > which in C is an int and anything except 0 or 1 is evaluated to false at > compile time. No, in C bool is a distinct data type, and sizeof(bool) == 1. Values of that type other than 0 or 1 result in undefined behaviour. > > There was a time when 'logical' and 'bitwise' were used interchangeably, > based on the fact that 'boolean operators' work on 'boolean logic'. > > This is what lead me here: > > $ cat test.c > int f(int a) { > if ((a && 12) == 12 ) This will never be true. The result of (a && 12) is either 0 or 1, and so never equal to 12. > return 11; > return 10; > } > > $ gcc -c -O0 test.c && objdump -d test1.o > test1.o: file format elf64-x86-64 > Disassembly of section .text: > 0000000000000000 <f>: > 0: 55 push %rbp > 1: 48 89 e5 mov %rsp,%rbp > 4: 89 7d fc mov %edi,-0x4(%rbp) > 7: b8 00 00 00 00 mov $0xa,%eax > c: 5d pop %rbp > d: c3 retq > > With a single `&` it works as expected. Your expectation is wrong. > > In my defence, when I last did a C course all boolean operators were > bitwise. I doubt that is true. > I suddenly feel really old that even C has changed. Even the > definition of 'logical' and 'bitwise' has changed. I don't think that's true either. > Compare to "warning: comparison of constant ‘12’ with non-bitwise boolean > expression is always false [-Wbool-compare]" might lead to less confusion. It would confuse people who know C, because "non-bitwise boolean expression" is meaningless. > When expecting the result of an '&&' evaluation to be a bitwise AND, Your expectation is simply wrong, that's not how C works. We can't write diagnostics to suit every potential misunderstanding of how C works. The warning text is accurate and correct.