#include <omp.h>
#include <stdlib.h>

struct S { S (); S (long int, long int); ~S (); static int cnt1, cnt2, cnt3; long int s, t; };

int S::cnt1;
int S::cnt2;
int S::cnt3;

S::S ()
{
  #pragma omp atomic
  cnt1++;
}

S::S (long int x, long int y) : s (x), t (y)
{
  #pragma omp atomic update
  ++cnt2;
}

S::~S ()
{
  #pragma omp atomic
  cnt3 = cnt3 + 1;
  if (t < 3 || t > 9 || (t & 1) == 0)
    abort ();
}

void
bar (S *p, S *o)
{
  p->s = 1;
  if (o->t != 5)
    abort ();
  p->t = 9;
}

static inline void
baz (S *o, S *i)
{
  if (o->t != 5 || i->t != 9)
    abort ();
  o->s *= i->s;
}

#pragma omp declare reduction (+: S : omp_out.s += omp_in.s) initializer (omp_priv (0, 3))
#pragma omp declare reduction (*: S : baz (&omp_out, &omp_in)) initializer (bar (&omp_priv, &omp_orig))

S a = { 0, 7 };
S b (1, 5);

void
foo ()
{
  int i;
  for (i = 0; i < 2; i++)
    #pragma omp task in_reduction (*: b) in_reduction (+: a)
    {
      a.s += 7;
      b.s *= 2;
      if ((a.t != 7 && a.t != 3) || (b.t != 5 && b.t != 9))
	abort ();
    }
}

void
test ()
{
  S c = { 0, 7 };
  int t;
  #pragma omp parallel num_threads (1)
  {
    S d (1, 5);
    int r = 0;
    #pragma omp parallel reduction (task, +: a, c) reduction (task, *: b, d) \
			 reduction (+: r)
    {
      int i;
      #pragma omp master
      t = omp_get_num_threads ();
      r++;
      a.s += 3;
      c.s += 4;
      #pragma omp for
      for (i = 0; i < 4; i++)
	#pragma omp task in_reduction (*: b, d) in_reduction (+: a, c)
	{
	  int j;
	  a.s += 7;
	  b.s *= 2;
	  for (j = 0; j < 2; j++)
	    #pragma omp task in_reduction (+: a) in_reduction (*: b) \
			     in_reduction (+: c) in_reduction (*: d)
	    {
	      a.s += 7;
	      b.s *= 2;
	      c.s += 9;
	      d.s *= 3;
	      foo ();
	      if ((a.t != 7 && a.t != 3) || (b.t != 5 && b.t != 9)
		  || (c.t != 7 && c.t != 3) || (d.t != 5 && d.t != 9))
		abort ();
	    }
	  c.s += 9;
	  d.s *= 3;
	  if ((a.t != 7 && a.t != 3) || (b.t != 5 && b.t != 9)
	      || (c.t != 7 && c.t != 3) || (d.t != 5 && d.t != 9))
	    abort ();
	}
    }
#define THREEP4 (3L * 3L * 3L * 3L)
    if (d.s != (THREEP4 * THREEP4 * THREEP4) || d.t != 5 || r != t)
      abort ();
  }
  if (a.s != 28 * 7 + 3 * t || a.t != 7 || b.s != (1L << 28) || b.t != 5
      || c.s != 12 * 9 + 4 * t || c.t != 7)
    abort ();
}

int
main ()
{
  int c1 = S::cnt1, c2 = S::cnt2, c3 = S::cnt3;
  test ();
  if (S::cnt1 + S::cnt2 - c1 - c2 != S::cnt3 - c3)
    abort ();
}
