(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
Wdangling-pointer-4.c
       1  /* PR middle-end/63272 - GCC should warn when using pointer to dead scoped
       2     variable within the same function
       3     Exercise -Wdangling-pointer for VLAs.
       4     { dg-do compile }
       5     { dg-options "-O0 -Wall -ftrack-macro-expansion=0" }
       6     { dg-require-effective-target alloca } */
       7  
       8  void sink (void*, ...);
       9  
      10  void nowarn_vla (int n)
      11  {
      12    {
      13      int vla1[n];
      14      int *p1 = vla1;
      15      sink (p1);
      16  
      17      {
      18        int vla2[n];
      19        int *p2 = vla2;
      20        sink (p1, p2);
      21  
      22        {
      23  	int vla3[n];
      24  	int *p3 = vla3;
      25  	sink (p1, p2, p3);
      26        }
      27        sink (p1, p2);
      28      }
      29      sink (p1);
      30    }
      31  }
      32  
      33  void warn_one_vla (int n)
      34  {
      35    int *p;
      36    {
      37      int vla[n];               // { dg-message "'vla' declared" "pr??????" { xfail *-*-* } }
      38      p = vla;
      39    }
      40    sink (p);                   // { dg-warning "using a dangling pointer to 'vla'" "vla" { xfail *-*-* } }
      41  }
      42  
      43  
      44  void warn_two_vlas_same_block (int n)
      45  {
      46    int *p, *q;
      47    {
      48      int vla1[n];              // { dg-message "'vla1' declared" "pr??????" { xfail *-*-* } }
      49      int vla2[n];              // { dg-message "'vla2' declared" "pr??????" { xfail *-*-* } }
      50      p = vla1;
      51      q = vla2;
      52    }
      53  
      54    sink (p);                   // { dg-warning "using a dangling pointer to 'vla1'" "vla" { xfail *-*-* } }
      55    sink (q);                   // { dg-warning "using a dangling pointer to 'vla2'" "vla" { xfail *-*-* } }
      56  }
      57  
      58  
      59  void warn_two_vlas_in_series (int n)
      60  {
      61    int *p;
      62    {
      63      int vla1[n];              // { dg-message "'vla1' declared" "pr??????" { xfail *-*-* } }
      64      p = vla1;
      65    }
      66    sink (p);                   // { dg-warning "using a dangling pointer to 'vla1'" "vla" { xfail *-*-* } }
      67  
      68    int *q;
      69    {
      70      int vla2[n];              // { dg-message "'vla2' declared" "pr??????" { xfail *-*-* } }
      71      q = vla2;
      72    }
      73    sink (q);                   // { dg-warning "using a dangling pointer to 'vla2'" "vla" { xfail *-*-* } }
      74  }