(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
pr101419.c
       1  /* PR tree-optimization/101419 */
       2  /* { dg-do compile } */
       3  /* { dg-options "-O2" } */
       4  
       5  typedef __SIZE_TYPE__ size_t;
       6  void baz (int, int) __attribute__((__warning__("detected overflow")));
       7  
       8  union U {
       9    int i;
      10    char c;
      11  };
      12  
      13  static void
      14  foo (union U *u)
      15  {
      16    if (__builtin_object_size (&u->c, 1) < sizeof (u->c))
      17      baz (__builtin_object_size (&u->c, 1), sizeof (u->c));	/* { dg-bogus "detected overflow" } */
      18    __builtin_memset (&u->c, 0, sizeof (u->c));
      19  
      20    if (__builtin_object_size (&u->i, 1) < sizeof (u->i))
      21      baz (__builtin_object_size (&u->i, 1), sizeof (u->i));	/* { dg-bogus "detected overflow" } */
      22    __builtin_memset (&u->i, 0, sizeof (u->i));
      23  }
      24  
      25  void
      26  bar (union U *u)
      27  {
      28    int i, j;
      29    for (i = 0; i < 1; i++)
      30      {
      31        foo (u);
      32        for (j = 0; j < 2; j++)
      33          asm volatile ("");
      34      }
      35  }
      36  
      37  static void
      38  qux (void *p, size_t q)
      39  {
      40    if (__builtin_object_size (p, 1) < q)
      41      baz (__builtin_object_size (p, 1), q);			/* { dg-bogus "detected overflow" } */
      42    __builtin_memset (p, 0, q);
      43  }
      44  
      45  static void
      46  corge (union U *u)
      47  {
      48    qux (&u->c, sizeof (u->c));
      49    qux (&u->i, sizeof (u->i));
      50  }
      51  
      52  void
      53  garply (union U *u)
      54  {
      55    int i, j;
      56    for (i = 0; i < 1; i++)
      57      {
      58        corge (u);
      59        for (j = 0; j < 2; j++)
      60          asm volatile ("");
      61      }
      62  }