------- 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

Reply via email to