1  /* { dg-do compile }
       2     { dg-options "-O2 -Wall" } */
       3  
       4  typedef __SIZE_TYPE__ size_t;
       5  
       6  void* malloc (size_t);
       7  void* memcpy (void*, const void*, size_t);
       8  size_t strlen (const char *);
       9  
      10  // Test case reduced from gcc/attribs.c.
      11  
      12  char* sorted_attr_string (char *argv[])
      13  {
      14    size_t n = 0;
      15    unsigned int i;
      16  
      17    for (i = 0; argv[i]; ++i)
      18      n += strlen (argv[i]);
      19  
      20    char *s = (char*)malloc (n);
      21    n = 0;
      22    for (i = 0; argv[i]; ++i)
      23      {
      24        const char *str = argv[i];
      25        size_t len = strlen (str);
      26        memcpy (s + n, str, len);
      27        n += len + 1;
      28      }
      29  
      30    /* Replace "=,-" with "_".  */
      31    for (i = 0; i < strlen (s); i++)
      32      if (s[i] == '=')
      33        s[i] = '_';             // { dg-bogus "\\\[-Wstringop-overflow" }
      34  
      35    return s;
      36  }
      37  
      38  
      39  void f (void*);
      40  
      41  void nowarn_cond_escape (int c, int *x)
      42  {
      43    extern char a3[3], a5[5];
      44  
      45    char *p;
      46    if (c)
      47      {
      48        p = a3;
      49        *x = 2;
      50     }
      51     else
      52       {
      53         p = a5;
      54         *x = 4;
      55       }
      56  
      57    f (p);   // may modify *x
      58  
      59    if (*x == 2)
      60      p[2] = 0;
      61    else if (*x == 4)
      62      p[4] = 0;                 // { dg-bogus "\\\[-Wstringop-overflow" }
      63  }
      64  
      65  void warn_cond_escape (int c, int *x)
      66  {
      67    extern char a3_2[3];
      68    extern char a5_2[5];        // { dg-message "at offset 5 into object 'a5_2'" }
      69  
      70    char *p;
      71    if (c)
      72      {
      73        p = a3_2;
      74        *x = 2;
      75     }
      76     else
      77       {
      78         p = a5_2;
      79         *x = 5;
      80       }
      81  
      82    f (p);   // may modify *x
      83  
      84    if (*x == 2)
      85      p[2] = 0;
      86    else if (*x == 5)
      87      p[5] = 0;                 // { dg-warning "\\\[-Warray-bounds|-Wstringop-overflow" }
      88  }