1  /* Verify that dereferencing uninitialized VLAs correctly reflects
       2     offsets into the objects.
       3     The test's main purpose is to exercise the formatting of MEM_REFs.
       4     If -Wuninitialized gets smarter and detects uninitialized accesses
       5     before they're turned into MEM_REFs the test will likely need to
       6     be adjusted.  Ditto if -Wuninitialized output changes for some
       7     other reason.
       8     { dg-do compile { target { { lp64 || ilp32 } || llp64 } } }
       9     { dg-options "-O2 -Wall -ftrack-macro-expansion=0 -fno-ipa-modref" }
      10     { dg-require-effective-target alloca } */
      11  
      12  #define CONCAT(x, y)   x ## y
      13  #define CAT(x, y)      CONCAT(x, y)
      14  #define UNIQ(name)     CAT (name, __LINE__)
      15  
      16  typedef __SIZE_TYPE__ size_t;
      17  
      18  extern void* malloc (size_t);
      19  
      20  void sink (void*, ...);
      21  
      22  #define T(Type, idx, off)			\
      23    __attribute__ ((noipa))			\
      24    void UNIQ (test_)(int n)			\
      25    {						\
      26      char a[n], *p = a;				\
      27      Type *q = (Type*)((char*)p + off);		\
      28      sink (p, q[idx]);				\
      29    }						\
      30    typedef void dummy_type
      31  
      32  T (int, 0, 0);      // { dg-warning "'\\*\\(int \\*\\)a' is used uninitialized" }
      33  T (int, 0, 1);      // { dg-warning "'\\*\\(int \\*\\)\\(\\(char \\*\\)a \\+ 1\\)'" }
      34  T (int, 0, 2);      // { dg-warning "'\\*\\(int \\*\\)\\(\\(char \\*\\)a \\+ 2\\)'" }
      35  T (int, 0, 3);      // { dg-warning "'\\*\\(int \\*\\)\\(\\(char \\*\\)a \\+ 3\\)'" }
      36  T (int, 0, 4);      // { dg-warning "'\\(\\(int \\*\\)a\\)\\\[1]'" }
      37  T (int, 0, 5);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 1\\)\\)\\\[1]'" }
      38  T (int, 0, 6);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 2\\)\\)\\\[1]'" }
      39  T (int, 0, 7);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 3\\)\\)\\\[1]'" }
      40  T (int, 0, 8);      // { dg-warning "'\\(\\(int \\*\\)a\\)\\\[2]'" }
      41  T (int, 0, 9);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 1\\)\\)\\\[2]'" }
      42  
      43  
      44  T (int, 1, 0);      // { dg-warning "'\\(\\(int \\*\\)a\\)\\\[1]' is used uninitialized" }
      45  T (int, 1, 1);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 1\\)\\)\\\[1]'" }
      46  T (int, 1, 2);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 2\\)\\)\\\[1]'" }
      47  T (int, 1, 3);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 3\\)\\)\\\[1]'" }
      48  T (int, 1, 4);      // { dg-warning "'\\(\\(int \\*\\)a\\)\\\[2]'" }
      49  T (int, 1, 5);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 1\\)\\)\\\[2]'" }
      50  T (int, 1, 6);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 2\\)\\)\\\[2]'" }
      51  T (int, 1, 7);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 3\\)\\)\\\[2]'" }
      52  T (int, 1, 8);      // { dg-warning "'\\(\\(int \\*\\)a\\)\\\[3]'" }
      53  T (int, 1, 9);      // { dg-warning "'\\(\\(int \\*\\)\\(\\(char \\*\\)a \\+ 1\\)\\)\\\[3]'" }