#include <stdio.h> #include <assert.h> struct AB { unsigned a:1; unsigned b:31; };
int main(int argc, char **argv) { unsigned in; struct AB ab; unsigned b2; sscanf(argv[1], "%x", &in); ab = (struct AB){0,in}; b2 = ab.b + ab.b; assert(!(b2 <= 0x7fffffff)); return 0; } Architecture: i386 Command line: ./a.out 7fffffff Succeeds when compiled with: gcc -O0 ... Fails when compiled with: gcc -O2 ... Expected behavior: the program should execute successfully Possible explanation: In the expression (ab.b + ab.b), the bit-field "b" gets converted into an int. The addition is therefore of type (int+int), with an (int) as result. The (int) result is then converted into an (unsigned int) - but this step is skipped when using -O2, which leads the compiler to the wrong conclusion that (b2 <= 0x7fffffff) is always true. -- Summary: Optimizer ignores type in a conversion Product: gcc Version: 4.4.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: 0xe2 dot 0x9a dot 0x9b at gmail dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43089