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];

__attribute__((noinline, noclone)) void
foo (A<int> (*&x)[3][2], M<int> *y, B<long> (&w)[1][2])
{
  A<unsigned long long> a[9];
  short bb[5] = {};
  short (&b)[5] = bb;
  #pragma omp parallel for reduction(+:x[0:2][:][0:2], z[:4]) \
			   reduction(*:y[:3]) reduction(|:a[:4]) \
			   reduction(&:w[0:][:2]) 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) == 2)
	y[1].t *= 7;
      if ((i & 63) == 3)
	y[2].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[2])
	b[2] = 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[2] != 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];

struct S
{
  A<int> (*&x)[3][2];
  M<int> *y;
  B<long> (&w)[1][2];
  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 ();
};

void
S::foo ()
{
  #pragma omp parallel for reduction(+:x[0:2][:][0:2], z[:4]) \
			   reduction(*:y[:3]) reduction(|:a[:4]) \
			   reduction(&:w[0:][:2]) 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) == 2)
	y[1].t *= 7;
      if ((i & 63) == 3)
	y[2].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[2])
	b[2] = 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 (p, y + 1, w);
  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 s;
  s.foo ();
  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 ();
}
