assert(i) gives "will never be executed" on Linux. assert(0) and assert(1) are silent.
I've tried to vary the assert() definition, e.g. give __assert_fail() return type int and do (void)(i ? 0 : (0 & __assert_fail(...))), but only removing __attribute__((noreturn)) seems to kill the warning. I don't want to do that. gcc configuration: ../gcc-4.0.1/configure --quiet --prefix=/scratch/install --program-suffix=-4.0.1 --enable-version-specific-runtime-libs --enable-languages=c,c++ bash$ gcc-4.0.1 -save-temps -fsyntax-only -Wunreachable-code foo.cfoo.c: In function 'Noisy_a': foo.c:4: warning: will never be executed bash$ cat -s foo.i # 1 "foo.c" # 1 "<built-in>" # 1 "<command line>" # 1 "foo.c" # 1 "/usr/include/assert.h" 1 3 4 # 36 "/usr/include/assert.h" 3 4 # 1 "/usr/include/features.h" 1 3 4 # 296 "/usr/include/features.h" 3 4 # 1 "/usr/include/sys/cdefs.h" 1 3 4 # 297 "/usr/include/features.h" 2 3 4 # 319 "/usr/include/features.h" 3 4 # 1 "/usr/include/gnu/stubs.h" 1 3 4 # 320 "/usr/include/features.h" 2 3 4 # 37 "/usr/include/assert.h" 2 3 4 # 65 "/usr/include/assert.h" 3 4 extern void __assert_fail (__const char *__assertion, __const char *__file, unsigned int __line, __const char *__function) __attribute__ ((__noreturn__)); extern void __assert_perror_fail (int __errnum, __const char *__file, unsigned int __line, __const char *__function) __attribute__ ((__noreturn__)); extern void __assert (const char *__assertion, const char *__file, int __line) __attribute__ ((__noreturn__)); # 2 "foo.c" 2 void Noisy_a(int i) { ((void) ((i) ? 0 : (__assert_fail ("i", "foo.c", 4, __PRETTY_FUNCTION__), 0))); } void Silent_b() { ((void) ((0) ? 0 : (__assert_fail ("0", "foo.c", 7, __PRETTY_FUNCTION__), 0))); } void Silent_c() { ((void) ((1) ? 0 : (__assert_fail ("1", "foo.c", 10, __PRETTY_FUNCTION__), 0))); } -- Summary: assert(i) gives "will never be executed" due to noreturn Product: gcc Version: 4.0.1 Status: UNCONFIRMED Severity: minor Priority: P2 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: h dot b dot furuseth at usit dot uio dot no CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu http://gcc.gnu.org/bugzilla/show_bug.cgi?id=22414