This bug exists in various forms in multiple versions of gcc: $ cat gccbug.c struct sel { const char *name; unsigned int enabled; }; int selog_on(struct sel *); #define selog_on(sel) \ (sel.enabled == 0 \ ? selog_on(&sel) \ : sel.enabled != 42) void dostuff(int *); void gccbug1(void) { struct sel sel = { "test", 0 }; if(selog_on(sel)) { dostuff(0); } } void gccbug2(void) { struct sel sel = { "test", 0 }; if(selog_on(sel)) { int i; dostuff(&i); } } $ gcc -O -Wunreachable-code -c gccbug.c gccbug.c: In function `gccbug2': gccbug.c:25: warning: will never be executed $ gcc --version gcc --version gcc (GCC) 3.4.4 [FreeBSD] 20050518 $ gcc -O -Wunreachable-code -c gccbug.c gccbug.c: In function ‘gccbug2’: gccbug.c:24: warning: will never be executed gccbug.c: In function ‘gccbug1’: gccbug.c:17: warning: will never be executed $ gcc -O -Werror -Wunreachable-code -c gccbug.c cc1: warnings being treated as errors gccbug.c: In function ‘gccbug2’: gccbug.c:24: warning: will never be executed $ gcc --version gcc (GCC) 4.1.2 20070115 (prerelease) (SUSE Linux) $ gcc -O -Wunreachable-code -c gccbug.c gccbug.c: In function 'gccbug2': gccbug.c:24: warning: will never be executed gccbug.c: In function 'gccbug1': gccbug.c:17: warning: will never be executed $ gcc -O -Werror -Wunreachable-code -c gccbug.c cc1: warnings being treated as errors gccbug.c: In function 'gccbug2': gccbug.c:24: warning: will never be executed $ gcc --version gcc (GCC) 4.2.1 20070719 [FreeBSD]
The warning looks fine for me, it is saying selog_on(&sel) will never be executed.
Sorry I mean: [t.c : 24] D.1191_5 = sel.enabled; [t.c : 24] iftmp.1_6 = D.1191_5 != 42; As far as I can tell this warning is correct.
The code is executed when the function selog_on() returns true. The warning is also inconsistent, which also points to an analysis bug.
This warning depends on optimizations so what you do expect with the inconsistency. So in one case, we decide that i can alias sel which is obviously not true but what do you expect from aliasing.