text: extern void abort (void);
  
  int
  main ()
  {
    int a = 1, b = 2, c = 4, d[7];
    #pragma omp parallel
    {
      #pragma omp single
      {
        #pragma omp taskgroup
        {
  	#pragma omp target enter data nowait map (to: a, b, c) depend(out: d[0])
  	#pragma omp target nowait map (alloc: a, b) depend(in: d[0]) depend(out: d[1])
  	{
  	  #pragma omp atomic update
  	  a |= 4;
  	  #pragma omp atomic update
  	  b |= 8;
  	}
  	#pragma omp target nowait map (alloc: a, c) depend(in: d[0]) depend(out: d[2])
  	{
  	  #pragma omp atomic update
  	  a |= 16;
  	  #pragma omp atomic update
  	  c |= 32;
  	}
  	#pragma omp target exit data nowait map (from: a, b, c) depend(in: d[1], d[2])
        }
        if (a != 21 || b != 10 || c != 36)
  	abort ();
        #pragma omp target map (tofrom: a, b) nowait
        {
  	a &= ~16;
  	b &= ~2;
        }
        #pragma omp target map (tofrom: c) nowait
        {
  	c |= 8;
        }
      } /* Implicit barrier here.  */
      #pragma omp single
      {
        if (a != 5 || b != 8 || c != 44)
  	abort ();
        #pragma omp target map (tofrom: a, b) nowait
        {
  	a |= 32;
  	b |= 4;
        }
        #pragma omp target map (tofrom: c) nowait
        c &= ~4;
        #pragma omp taskwait
        if (a != 37 || b != 12 || c != 40)
  	abort ();
        #pragma omp target nowait map (tofrom: a, b) depend(out: d[3])
        {
  	#pragma omp atomic update
  	a = a + 9;
  	b -= 8;
        }
        #pragma omp target nowait map (tofrom: a, c) depend(out: d[4])
        {
  	#pragma omp atomic update
  	a = a + 4;
  	c >>= 1;
        }
        #pragma omp task if (0) depend (in: d[3], d[4]) shared (a, b, c)
        if (a != 50 || b != 4 || c != 20)
  	abort ();
        #pragma omp task shared (a)
        a += 50;
        #pragma omp target nowait map (tofrom: b)
        b++;
        #pragma omp target map (tofrom: c) nowait
        c--;
        #pragma omp taskwait
        if (a != 100 || b != 5 || c != 19)
  	abort ();
        #pragma omp target map (tofrom: a) nowait depend(out: d[5])
        a++;
        #pragma omp target map (tofrom: b) nowait depend(out: d[6])
        b++;
        #pragma omp target map (tofrom: a, b) depend(in: d[5], d[6])
        {
  	if (a != 101 || b != 6)
  	  a = -9;
  	else
  	  {
  	    a = 24;
  	    b = 38;
  	  }
        }
        if (a != 24 || b != 38)
  	abort ();
      } /* Implicit barrier here.  */
      #pragma omp master
      {
        #pragma omp target nowait map (tofrom: a, b)
        {
  	a *= 2;
  	b++;
        }
        #pragma omp target map (tofrom: c) nowait
        c--;
      }
      #pragma omp barrier
      if (a != 48 || b != 39 || c != 18)
        abort ();
    }
    return 0;
  }
  