Compiling the following code with gcc 4.4.0 20090506 on x86 with 'gcc -fdiagnostics-show-option -fshow-column -O2 -Wunreachable-code strcmp.c -o strcmp':
-------8<-----------8<------- #include <string.h> #include <stdio.h> int main(int argc, char *argv[]) { if (argc != 3) return 1; printf("%d\n", strcmp(argv[1], "foo")); printf("%d\n", strcmp(argv[1], argv[2])); return 0; } -------8<-----------8<------- produces the warning: -------8<-----------8<------- strcmp.c: In function main: strcmp.c:9:17: warning: will never be executed [-Wunreachable-code] -------8<-----------8<------- using --save-temps you can see that the warning is about some generated code: -------8<-----------8<------- strcmp.c: In function main: strcmp.c:9:2193: warning: will never be executed [-Wunreachable-code] -------8<-----------8<------- here the line of the .i file: -------8<-----------8<------- printf("%d\n", __extension__ ({ size_t __s1_len, __s2_len; (__builtin_constant_p (argv[1]) && __builtin_constant_p ("foo") && (__s1_len = strlen (argv[1]), __s2_len = strlen ("foo"), (!((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1) || __s1_len >= 4) && (!((size_t)(const void *)(("foo") + 1) - (size_t)(const void *)("foo") == 1) || __s2_len >= 4)) ? __builtin_strcmp (argv[1], "foo") : (__builtin_constant_p (argv[1]) && ((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1) && (__s1_len = strlen (argv[1]), __s1_len < 4) ? (__builtin_constant_p ("foo") && ((size_t)(const void *)(("foo") + 1) - (size_t)(const void *)("foo") == 1) ? __builtin_strcmp (argv[1], "foo") : (__extension__ ({ __const unsigned char *__s2 = (__const unsigned char *) (__const char *) ("foo"); register int __result = (((__const unsigned char *) (__const char *) (argv[1]))[0] - __s2[0]); if (__s1_len > 0 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[1]))[1] - __s2[1]); if (__s1_len > 1 && __result == 0) { __result = (((__const unsigned char *) (__const char *) (argv[1]))[2] - __s2[2]); if (__s1_len > 2 && __result == 0) __result = (((__const unsigned char *) (__const char *) (argv[1]))[3] - __s2[3]); } } __result; }))) : (__builtin_constant_p ("foo") && ((size_t)(const void *)(("foo") + 1) - (size_t)(const void *)("foo") == 1) && (__s2_len = strlen ("foo"), __s2_len < 4) ? (__builtin_constant_p (argv[1]) && ((size_t)(const void *)((argv[1]) + 1) - (size_t)(const void *)(argv[1]) == 1) ? __builtin_strcmp (argv[1], "foo") : (__extension__ ({ __const unsigned char *__s1 = (__const unsigned char *) (__const char *) (argv[1]); register int __result = __s1[0] - ((__const unsigned char *) (__const char *) ("foo"))[0]; if (__s2_len > 0 && __result == 0) { __result = (__s1[1] - ((__const unsigned char *) (__const char *) ("foo"))[1]); if (__s2_len > 1 && __result == 0) { __result = (__s1[2] - ((__const unsigned char *) (__const char *) ("foo"))[2]); if (__s2_len > 2 && __result == 0) __result = (__s1[3] - ((__const unsigned char *) (__const char *) ("foo"))[3]); } } __result; }))) : __builtin_strcmp (argv[1], "foo")))); })); -------8<-----------8<------- there aren't any problem with the second call to strcmp without constant parameters. -- Summary: -Wunreachable-code warns for strcmp with constant argument Product: gcc Version: 4.4.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: s dot contini at oltrelinux dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40412