https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97336
--- Comment #2 from Christian Franke <franke at computer dot org> --- Sorry, but I disagree that this report is INVALID. Unlike for example -Wstringop-overflow, warnings like -Wstring-compare should IMO only occur if the warning condition holds for *all* function calls generated by loop unrolling. BTW, if the partial loop unrolling is done manually, the warning should occur, but does not: int f(const char * p, int n) { char buf[10] = {0, }; int i = 0; if (n <= 0) { if (!__builtin_strncmp(buf, "12345", 5) // <== no warning && (i == 5 || buf[5] == ' ')) // <== warning if removed return 1; } else { do { buf[i] = p[i]; i++; } while (i < (int)sizeof(buf)-1 && i < n); if (!__builtin_strncmp(buf, "12345", 5) && (i == 5 || buf[5] == ' ')) return 1; } return 0; } With the above code, the warning occurs if the condition "&& (i == 5 || buf[5] == ' ')" is removed. If this is done in the original testcase, the warning does no longer occur.