(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
Wdangling-pointer-2.c
       1  /* Exercise conditional C-only uses of dangling pointers with optimization.
       2     { dg-do compile }
       3     { dg-options "-O2 -Wall" } */
       4  
       5  typedef __SIZE_TYPE__ size_t;
       6  
       7  extern void* memchr (const void*, int, size_t);
       8  extern char* strchr (const char*, int);
       9  
      10  void sink (void*, ...);
      11  
      12  
      13  void nowarn_compound_literal (int i, int j)
      14  {
      15    {
      16      int *p = i ? (int[]){ 1, 2, 3 } : (int[]){ 4, 5, 6 };
      17      sink (p);
      18    }
      19    {
      20      int a[] = { 1, 2, 3 };
      21      int *q = i ? (int[]){ 4, 5, 6 } : a;
      22      int *p = &q[1];
      23      sink (p);
      24    }
      25    {
      26      int *p = i ? (int[]){ 1, 2, 3 } : (int[]){ 4, 5, 6 };
      27      int *q = __builtin_memchr (p, 2, 3 * sizeof *p);
      28      sink (q);
      29    }
      30    {
      31      int a[] = { i, i + 1, i + 2, 3 };
      32      int *p = i ? (int[]){ j, j + 1, j + 2, 3 } : a;
      33      int *q = __builtin_memchr (p, 3, 4 * sizeof *p);
      34      sink (q);
      35    }
      36  }
      37  
      38  
      39  void warn_maybe_compound_literal (int i, int j)
      40  {
      41    int a[] = { 1, 2, 3 }, *p;
      42    {
      43      p = i ? (int[]){ 4, 5, 6 } : a;
      44    }
      45    // When the 'p' is optimized away it's not mentioned in the warning.
      46    sink (p);         // { dg-warning "dangling pointer \('p' \)?to an unnamed temporary may be used" }
      47  }
      48  
      49  
      50  void warn_maybe_compound_literal_memchr (int i, int j, int x)
      51  {
      52    int a[] = { 1, 2, 3 }, *p;
      53    {
      54      int *q = i ? (int[]){ 4, 5, 6 } : a;
      55      p = memchr (q, x, 3 * sizeof *q);
      56    }
      57    sink (p);         // { dg-warning "dangling pointer 'p' to an unnamed temporary may be used" }
      58  }
      59  
      60  
      61  void warn_maybe_array (int i, int j)
      62  {
      63    int a[] = { 1, 2, 3 }, *p;
      64    {
      65      int b[] = { 4, 5, 6 };
      66      p = i ? a : b;
      67    }
      68    // When the 'p' is optimized away it's not mentioned in the warning.
      69    sink (p);         // { dg-warning "dangling pointer \('p' \)?to 'b' may be used" }
      70  }
      71  
      72  
      73  void warn_maybe_array_memchr (int i, int j, int x)
      74  {
      75    int a[] = { 1, 2, 3 }, *p;
      76    {
      77      int b[] = { 4, 5, 6 };
      78      int *q = i ? a : b;
      79      p = memchr (q, x, 3 * sizeof *q);
      80    }
      81    sink (p);         // { dg-warning "dangling pointer 'p' to 'b' may be used" }
      82  }