1  /* PR middle-end/98578 - ICE warning on uninitialized VLA access
       2     { dg-do compile }
       3     { dg-options "-O2 -Wall -fno-ipa-modref" }
       4     { dg-require-effective-target alloca } */
       5  
       6  void* malloc (__SIZE_TYPE__);
       7  
       8  void T (int, ...);
       9  
      10  void vla_n (int n, int i)
      11  {
      12    int a1[n];
      13  
      14    /* a1[I] should be formatted as as a1[I] (or, for I == 0, perhaps
      15       as *a1), but definitely not as *a1[I].  This is a bug in VLA
      16       formatting.  */
      17    T (a1[0]);        // { dg-warning "'a1\\\[0]' is used uninitialized" "pr98587" { xfail *-*-* } }
      18                      // { dg-warning "'\\*a1\\\[0]' is used uninitialized" "spurious star" { target *-*-* } .-1 }
      19    T (a1[1]);        // { dg-warning "a1\\\[1]' is used uninitialized" }
      20    T (a1[i]);        // { dg-warning "a1\\\[i]' is used uninitialized" }
      21  }
      22  
      23  void vla_n_2 (int n, int i)
      24  {
      25    int a2[n][2];
      26  
      27    T (a2[0][0]);   // { dg-warning "a2\\\[0]\\\[0]' is used uninitialized" }
      28    T (a2[2][1]);   // { dg-warning "a2\\\[2]\\\[1]' is used uninitialized" }
      29    T (a2[3][i]);   // { dg-warning "a2\\\[3]\\\[i]' is used uninitialized" }
      30    T (a2[i][0]);   // { dg-warning "a2\\\[i]\\\[0]' is used uninitialized" }
      31    T (a2[i][i]);   // { dg-warning "a2\\\[i]\\\[i]' is used uninitialized" }
      32  }
      33  
      34  
      35  void vla_3_n (int n, int i)
      36  {
      37    int a2[3][n];
      38  
      39    T (a2[0][0]);     // { dg-warning "a2\\\[0]\\\[0]' is used uninitialized" }
      40    T (a2[1][2]);     // { dg-warning "a2\\\[1]\\\[2]' is used uninitialized" }
      41    T (a2[2][i]);     // { dg-warning "a2\\\[2]\\\[i]' is used uninitialized" }
      42    T (a2[i][3]);     // { dg-warning "a2\\\[i]\\\[3]' is used uninitialized" }
      43    T (a2[i][i]);     // { dg-warning "a2\\\[i]\\\[i]' is used uninitialized" }
      44  }
      45  
      46  
      47  void vla_n_n (int n, int i)
      48  {
      49    int a2[n][n];
      50  
      51    T (a2[0][0]);     // { dg-warning "a2\\\[0]\\\[0]' is used uninitialized" }
      52    T (a2[4][5]);     // { dg-warning "a2\\\[4]\\\[5]' is used uninitialized" }
      53    T (a2[6][i]);     // { dg-warning "a2\\\[6]\\\[i]' is used uninitialized" }
      54    T (a2[i][7]);     // { dg-warning "a2\\\[i]\\\[7]' is used uninitialized" }
      55    T (a2[i][i]);     // { dg-warning "a2\\\[i]\\\[i]' is used uninitialized" }
      56  }
      57  
      58  
      59  void char_ptr_n (int n, int i)
      60  {
      61    char *p = malloc (n);
      62  
      63    T (p[0]);         // { dg-warning "'\\\*p' is used uninitialized" }
      64    T (p[1]);         // { dg-warning "'p\\\[1]' is used uninitialized" }
      65    T (p[i]);         // { dg-warning "'p\\\[i]' is used uninitialized" "pr98587" { xfail *-*-* } }
      66                      // { dg-warning "is used uninitialized" "POINTER_PLUS_EXPR" { target *-*-* } .-1 }
      67  }
      68  
      69  
      70  void int_ptr_n (int n, int i)
      71  {
      72    int *p = malloc (n);
      73  
      74    T (p[0]);         // { dg-warning "'\\\*p' is used uninitialized" }
      75    T (p[1]);         // { dg-warning "'p\\\[1]' is used uninitialized" }
      76    T (p[i]);         // { dg-warning "'p\\\[i]' is used uninitialized" "pr98587" { xfail *-*-* } }
      77                      // { dg-warning "is used uninitialized" "POINTER_PLUS_EXPR" { target *-*-* } .-1 }
      78  }
      79  
      80  
      81  void int_arr_ptr_n (int n, int i)
      82  {
      83    int (*p)[n] = malloc (n);
      84  
      85    T ((*p)[0]);      // { dg-warning "\\(\\*p\\)\\\[0]' is used uninitialized" "pr98587" { xfail *-*-* } }
      86                      // { dg-warning "\\*p\\\[0]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
      87    T ((*p)[1]);      // { dg-warning "\\(\\*p\\)\\\[1]' is used uninitialized" "pr98587" { xfail *-*-* } }
      88                      // { dg-warning "\\*p\\\[1]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
      89    T ((*p)[i]);      // { dg-warning "\\(\\*p\\)\\\[i]' is used uninitialized" "pr98587" { xfail *-*-* } }
      90                      // { dg-warning "\\*p\\\[i]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
      91  }
      92  
      93  
      94  void int_arr_ptr_n_n (int n, int i)
      95  {
      96    int (*p)[n][n] = malloc (n);
      97  
      98    T ((*p)[0][0]);   // { dg-warning "\\(\\*p\\)\\\[0]\\\[0]' is used uninitialized" "pr98587" { xfail *-*-* } }
      99                      // { dg-warning "\\*p\\\[0]\\\[0]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
     100    T ((*p)[1][2]);   // { dg-warning "\\(\\*p\\)\\\[1]\\\[2]' is used uninitialized" "pr98587" { xfail *-*-* } }
     101                      // { dg-warning "\\*p\\\[1]\\\[2]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
     102    T ((*p)[0][i]);   // { dg-warning "\\(\\*p\\)\\\[0]\\\[i]' is used uninitialized" "pr98587" { xfail *-*-* } }
     103                      // { dg-warning "\\*p\\\[0]\\\[i]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
     104    T ((*p)[3][i]);   // { dg-warning "\\(\\*p\\)\\\[3]\\\[i]' is used uninitialized" "pr98587" { xfail *-*-* } }
     105                      // { dg-warning "\\*p\\\[3]\\\[i]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
     106    T ((*p)[i][i]);   // { dg-warning "\\(\\*p\\)\\\[i]\\\[i]' is used uninitialized" "pr98587" { xfail *-*-* } }
     107                      // { dg-warning "\\*p\\\[i]\\\[i]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
     108  
     109    T ((*p)[i][i + 1]); // { dg-warning "\\(\\*p\\)\\\[i]\\\[i \\+ 1]' is used uninitialized" "pr98588" { xfail *-*-* } }
     110                      // { dg-warning "\\*p\\\[i]\\\[<unknown>]' is used uninitialized" "missing parens" { target *-*-* } .-1 }
     111  }