template <typename T>
struct A
{
  A () { t = 0; }
  A (T x) { t = x; }
  A (const A &x) { t = x.t; }
  ~A () {}
  T t;
};
template <typename T>
struct M
{
  M () { t = 1; }
  M (T x) { t = x; }
  M (const M &x) { t = x.t; }
  ~M () {}
  T t;
};
template <typename T>
struct B
{
  B () { t = ~(T) 0; }
  B (T x) { t = x; }
  B (const B &x) { t = x.t; }
  ~B () {}
  T t;
};
template <typename T>
void
add (T &x, T &y)
{
  x.t += y.t;
}
template <typename T>
void
zero (T &x)
{
  x.t = 0;
}
template <typename T>
void
orit (T *x, T *y)
{
  y->t |= x->t;
}
B<long> bb;
#pragma omp declare reduction(+:A<int>:omp_out.t += omp_in.t)
#pragma omp declare reduction(+:A<char>:add (omp_out, omp_in)) initializer(zero (omp_priv))
#pragma omp declare reduction(*:M<int>:omp_out.t *= omp_in.t) initializer(omp_priv = 1)
#pragma omp declare reduction(|:A<unsigned long long>:orit (&omp_in, &omp_out))
#pragma omp declare reduction(&:B<long>:omp_out.t = omp_out.t & omp_in.t) initializer(orit (&omp_priv, &omp_orig))
#pragma omp declare reduction(maxb:short:omp_out = omp_in > omp_out ? omp_in : omp_out) initializer(omp_priv = -6)

A<char> z[10];

template <int N>
__attribute__((noinline, noclone)) void
foo (A<int> (*&x)[3][N], M<int> *y, B<long> (&w)[1][N], int p1, long p2, long p3, int p4,
     int p5, long p6, short p7)
{
  A<unsigned long long> a[p7 + 4];
  short bb[p7];
  short (&b)[p7] = bb;
  for (int i = 0; i < p7; i++)
    bb[i] = -6;
  #pragma omp parallel for reduction(+:x[0:p1 + 1][:p2 + N - 2], z[:p3]) \
			   reduction(*:y[:p4]) reduction(|:a[:p5 - N + 2]) \
			   reduction(&:w[0:p6 - 3 + N][:p6]) reduction(maxb:b)
  for (int i = 0; i < 128; i++)
    {
      x[i / 64][i % 3][(i / 4) & 1].t += i;
      if ((i & 15) == 1)
	y[0].t *= 3;
      if ((i & 31) == N)
	y[1].t *= 7;
      if ((i & 63) == 3)
	y[N].t *= 17;
      z[i / 32].t += (i & 3);
      if (i < 4)
	z[i].t += i;
      a[i / 32].t |= 1ULL << (i & 30);
      w[0][i & 1].t &= ~(1L << (i / 17 * 3));
      if ((i % 79) > b[0])
	b[0] = i % 79;
      if ((i % 13) > b[1])
	b[1] = i % 13;
      if ((i % 23) > b[N])
	b[N] = i % 23;
      if ((i % 85) > b[3])
	b[3] = i % 85;
      if ((i % 192) > b[4])
	b[4] = i % 192;
    }
  for (int i = 0; i < 9; i++)
    if (a[i].t != (i < 4 ? 0x55555555ULL : 0))
      __builtin_abort ();
  if (bb[0] != 78 || bb[1] != 12 || bb[N] != 22 || bb[3] != 84 || bb[4] != 127)
    __builtin_abort ();
}

A<int> a3[4][3][2];
A<int> (*p3)[3][2] = &a3[1];
M<int> y3[5] = { 0, 1, 1, 1, 0 };
B<long> w3[1][2];

template <int N>
struct S
{
  A<int> (*&x)[3][N];
  M<int> *y;
  B<long> (&w)[1][N];
  A<char> z[10];
  short b[5];
  A<unsigned long long> a[9];
  S() : x(p3), y(y3+1), w(w3), z(), a(), b() {}
  __attribute__((noinline, noclone)) void foo (int, long, long, int, int, long, short);
};

template <int N>
void
S<N>::foo (int p1, long p2, long p3, int p4, int p5, long p6, short p7)
{
  #pragma omp parallel for reduction(+:x[0:p1 + 1][:p2][0:N], z[:p3 + N - 2]) \
			   reduction(*:y[:p4]) reduction(|:a[:p5]) \
			   reduction(&:w[0:p6 - 3 + N][:p6]) reduction(maxb:b)
  for (int i = 0; i < 128; i++)
    {
      x[i / 64][i % 3][(i / 4) & 1].t += i;
      if ((i & 15) == 1)
	y[0].t *= 3;
      if ((i & 31) == N)
	y[1].t *= 7;
      if ((i & 63) == 3)
	y[N].t *= 17;
      z[i / 32].t += (i & 3);
      if (i < 4)
	z[i].t += i;
      a[i / 32].t |= 1ULL << (i & 30);
      w[0][i & 1].t &= ~(1L << (i / 17 * 3));
      if ((i % 79) > b[0])
	b[0] = i % 79;
      if ((i % 13) > b[1])
	b[1] = i % 13;
      if ((i % 23) > b[N])
	b[N] = i % 23;
      if ((i % 85) > b[3])
	b[3] = i % 85;
      if ((i % 192) > b[4])
	b[4] = i % 192;
    }
}

int
main ()
{
  A<int> a[4][3][2];
  static int a2[4][3][2] = {{{ 0, 0 }, { 0, 0 }, { 0, 0 }},
			    {{ 312, 381 }, { 295, 356 }, { 337, 335 }},
			    {{ 1041, 975 }, { 1016, 1085 }, { 935, 1060 }},
			    {{ 0, 0 }, { 0, 0 }, { 0, 0 }}};
  A<int> (*p)[3][2] = &a[1];
  M<int> y[5] = { 0, 1, 1, 1, 0 };
  int y2[5] = { 0, 6561, 2401, 289, 0 };
  char z2[10] = { 48, 49, 50, 51, 0, 0, 0, 0, 0, 0 };
  B<long> w[1][2];
  foo<2> (p, y + 1, w, 1, 3L, 4L, 3, 4, 2L, 5);
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 3; j++)
      for (int k = 0; k < 2; k++)
	if (a[i][j][k].t != a2[i][j][k])
	  __builtin_abort ();
  for (int i = 0; i < 5; i++)
    if (y[i].t != y2[i])
      __builtin_abort ();
  for (int i = 0; i < 10; i++)
    if (z[i].t != z2[i])
      __builtin_abort ();
  if (w[0][0].t != ~0x249249L || w[0][1].t != ~0x249249L)
    __builtin_abort ();
  S<2> s;
  s.foo (1, 3L, 4L, 3, 4, 2L, 5);
  for (int i = 0; i < 9; i++)
    if (s.a[i].t != (i < 4 ? 0x55555555ULL : 0))
      __builtin_abort ();
  for (int i = 0; i < 4; i++)
    for (int j = 0; j < 3; j++)
      for (int k = 0; k < 2; k++)
	if (a3[i][j][k].t != a2[i][j][k])
	  __builtin_abort ();
  for (int i = 0; i < 5; i++)
    if (y3[i].t != y2[i])
      __builtin_abort ();
  for (int i = 0; i < 10; i++)
    if (s.z[i].t != z2[i])
      __builtin_abort ();
  if (w3[0][0].t != ~0x249249L || w3[0][1].t != ~0x249249L)
    __builtin_abort ();
  if (s.b[0] != 78 || s.b[1] != 12 || s.b[2] != 22
      || s.b[3] != 84 || s.b[4] != 127)
    __builtin_abort ();
}
