http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60971
Bug ID: 60971 Summary: Wrong code when coercing unsigned char to bool Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: peter at empeg dot com GCC 4.9.0 for x86_64 produces the wrong code for bar1 given this C++ file: unsigned char foo(); bool bar1() { return foo() & 1; } bool bar2() { return foo() & 2; } gcc -O2 -S gcc49.cpp -Wall -Wextra bar1 is compiled into a direct tailcall to foo() -- no and'ing with 1 is done to the result (so it returns the Wrong Thing if foo() returns 0x40, say). bar2 is correct however. GCC 4.8.2 got this right (its output for bar1 and bar2 is very similar except for the constant being and'ed with). GCC 4.9.0 gets it right if "unsigned char" is replaced with "unsigned short" or "unsigned int". 4.9.0 built from release tarball, configured --enable-shared \ --enable-languages=c,c++ --disable-werror \ --enable-threads --disable-multilib \ --enable-__cxa_atexit --with-system-zlib When GCC was compiled, CFLAGS, LIBCFLAGS, LIBCXXFLAGS, and BOOT_CFLAGS were all set to "-O2 -O9 -march=core2 -mtune=core2 -pipe".