1  extern void abort (void);
       2  
       3  int
       4  main ()
       5  {
       6    int a = 1, b = 2, c = 4, d[7];
       7    #pragma omp parallel
       8    {
       9      #pragma omp single
      10      {
      11        #pragma omp taskgroup
      12        {
      13  	#pragma omp target enter data nowait map (to: a, b, c) depend(out: d[0])
      14  	#pragma omp target nowait map (alloc: a, b) depend(in: d[0]) depend(out: d[1])
      15  	{
      16  	  #pragma omp atomic update
      17  	  a |= 4;
      18  	  #pragma omp atomic update
      19  	  b |= 8;
      20  	}
      21  	#pragma omp target nowait map (alloc: a, c) depend(in: d[0]) depend(out: d[2])
      22  	{
      23  	  #pragma omp atomic update
      24  	  a |= 16;
      25  	  #pragma omp atomic update
      26  	  c |= 32;
      27  	}
      28  	#pragma omp target exit data nowait map (from: a, b, c) depend(in: d[1], d[2])
      29        }
      30        if (a != 21 || b != 10 || c != 36)
      31  	abort ();
      32        #pragma omp target map (tofrom: a, b) nowait
      33        {
      34  	a &= ~16;
      35  	b &= ~2;
      36        }
      37        #pragma omp target map (tofrom: c) nowait
      38        {
      39  	c |= 8;
      40        }
      41      } /* Implicit barrier here.  */
      42      #pragma omp single
      43      {
      44        if (a != 5 || b != 8 || c != 44)
      45  	abort ();
      46        #pragma omp target map (tofrom: a, b) nowait
      47        {
      48  	a |= 32;
      49  	b |= 4;
      50        }
      51        #pragma omp target map (tofrom: c) nowait
      52        c &= ~4;
      53        #pragma omp taskwait
      54        if (a != 37 || b != 12 || c != 40)
      55  	abort ();
      56        #pragma omp target nowait map (tofrom: a, b) depend(out: d[3])
      57        {
      58  	#pragma omp atomic update
      59  	a = a + 9;
      60  	b -= 8;
      61        }
      62        #pragma omp target nowait map (tofrom: a, c) depend(out: d[4])
      63        {
      64  	#pragma omp atomic update
      65  	a = a + 4;
      66  	c >>= 1;
      67        }
      68        #pragma omp task if (0) depend (in: d[3], d[4]) shared (a, b, c)
      69        if (a != 50 || b != 4 || c != 20)
      70  	abort ();
      71        #pragma omp task shared (a)
      72        a += 50;
      73        #pragma omp target nowait map (tofrom: b)
      74        b++;
      75        #pragma omp target map (tofrom: c) nowait
      76        c--;
      77        #pragma omp taskwait
      78        if (a != 100 || b != 5 || c != 19)
      79  	abort ();
      80        #pragma omp target map (tofrom: a) nowait depend(out: d[5])
      81        a++;
      82        #pragma omp target map (tofrom: b) nowait depend(out: d[6])
      83        b++;
      84        #pragma omp target map (tofrom: a, b) depend(in: d[5], d[6])
      85        {
      86  	if (a != 101 || b != 6)
      87  	  a = -9;
      88  	else
      89  	  {
      90  	    a = 24;
      91  	    b = 38;
      92  	  }
      93        }
      94        if (a != 24 || b != 38)
      95  	abort ();
      96      } /* Implicit barrier here.  */
      97      #pragma omp master
      98      {
      99        #pragma omp target nowait map (tofrom: a, b)
     100        {
     101  	a *= 2;
     102  	b++;
     103        }
     104        #pragma omp target map (tofrom: c) nowait
     105        c--;
     106      }
     107      #pragma omp barrier
     108      if (a != 48 || b != 39 || c != 18)
     109        abort ();
     110    }
     111    return 0;
     112  }