/* PR tree-optimization/99121 - ICE in -Warray-bounds on a multidimensional
   VLA
   { dg-do compile }
   { dg-options "-O2 -Wall -ftrack-macro-expansion=0" } */

#define NOIPA __attribute__ ((noipa))

void sink (void*, ...);
#define T(a, x) sink (a, x)


NOIPA void a_0_n (int n)
{
  int a[0][n];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_n_0 (int n)
{
  int a[n][0];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}


NOIPA void a_1_n_0 (int n)
{
  int a[1][n][0];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_1_0_n (int n)
{
  int a[1][0][n];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_0_1_n (int n)
{
  int a[0][1][n];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_0_n_1 (int n)
{
  int a[0][n][1];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_n_0_n (int n)
{
  int a[n][0][n];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_n_n_0 (int n)
{
  int a[n][n][0];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_0_n_n (int n)
{
  int a[0][n][n];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_0_0_n (int n)
{
  int a[0][0][n];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_n_0_0 (int n)
{
  int a[n][0][0];

  sink (a);

  T (a, ((int *) a)[0]);      // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((char *) a)[1]);     // { dg-warning "\\\[-Warray-bounds" }
  T (a, ((float *) a)[n]);    // { dg-warning "\\\[-Warray-bounds" }
}

NOIPA void a_n_n_n (int n)
{
  int a[n][n][n];

  sink (a);

  T (a, ((int *) a)[-1]);     // { dg-warning "\\\[-Warray-bounds" "pr99140" }
  T (a, ((int *) a)[0]);
  T (a, ((char *) a)[1]);
  T (a, ((float *) a)[n]);
}