------- Comment #3 from manu at gcc dot gnu dot org 2009-07-31 16:46 ------- A reduced testcase:
extern inline const char * _strnchr (const char *str, char c, unsigned size); extern inline void * _memcpy (void *dst, const void *src, const unsigned size) { if (__builtin_constant_p (size)) { if (size == 5) { ((unsigned *) dst)[0] = ((const unsigned *) src)[0]; ((unsigned char *) dst)[4] = ((const unsigned char *) src)[4]; return dst; } } return dst; } extern inline unsigned _strlen (const char *str) { return _strnchr (str, '\0', (~0)) - str; } extern inline char * _strncpy (char *dst, const char *src, unsigned size) { unsigned len = _strlen (src); if (len > size) len = size; _memcpy (dst, src, len); dst[len] = '\0'; return dst; } extern inline char * _strcpy (char *dst, const char *src) { return _strncpy (dst, src, (~0)); } extern inline char * _strcat (char *dst, const char *src) { _strcpy (dst + _strlen (dst), src); return dst; } struct treat_directory_str { unsigned nb; }; void DOS_analyse (struct treat_directory_str *opaque) { char pattern[52] = "A:\\*.*"; char *pat = pattern; _strcat (pat, "*.*"); opaque->nb++; } It is weird that removing the last line of DOS_analyse silences the warning. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35392