1  /* { dg-require-effective-target alloca } */
       2  
       3  /* PR libstdc++/88101 */
       4  
       5  struct S { char a; short b; char c; };
       6  
       7  __attribute__((noipa)) void
       8  foo (int m, int n, int o)
       9  {
      10    long double a1[m];
      11    long double a2[m];
      12    struct S b1[m][n];
      13    struct S b2[m][n];
      14    struct S c1[m][n][o];
      15    struct S c2[m][n][o];
      16    int i, j, k;
      17    __builtin_memset (&a1, 0, sizeof (a1));
      18    __builtin_memset (&a2, ~0, sizeof (a2));
      19    __builtin_memset (&b1, 0, sizeof (b1));
      20    __builtin_memset (&b2, ~0, sizeof (b2));
      21    __builtin_memset (&c1, 0, sizeof (c1));
      22    __builtin_memset (&c2, ~0, sizeof (c2));
      23    for (i = 0; i < m; i++)
      24      {
      25        a1[i] = 13.132L;
      26        a2[i] = 13.132L;
      27        for (j = 0; j < n; j++)
      28  	{
      29  	  b1[i][j].a = -1;
      30  	  b1[i][j].b = -1;
      31  	  b1[i][j].c = -1;
      32  	  b2[i][j].a = -1;
      33  	  b2[i][j].b = -1;
      34  	  b2[i][j].c = -1;
      35  	  for (k = 0; k < o; k++)
      36  	    {
      37  	      c1[i][j][k].a = -1;
      38  	      c1[i][j][k].b = -1;
      39  	      c1[i][j][k].c = -1;
      40  	      c2[i][j][k].a = -1;
      41  	      c2[i][j][k].b = -1;
      42  	      c2[i][j][k].c = -1;
      43  	    }
      44  	}
      45      }
      46    __builtin_clear_padding (&a2);
      47    __builtin_clear_padding (&b2);
      48    __builtin_clear_padding (&c2);
      49    if (__builtin_memcmp (&a1, &a2, sizeof (a1))
      50        || __builtin_memcmp (&b1, &b2, sizeof (b1))
      51        || __builtin_memcmp (&c1, &c2, sizeof (c1)))
      52      __builtin_abort ();
      53  }
      54  
      55  int
      56  main ()
      57  {
      58    foo (5, 3, 4);
      59    foo (17, 2, 1);
      60    return 0;
      61  }