1  #include <stdlib.h>
       2  
       3  void
       4  dep (void)
       5  {
       6    int x = 1;
       7    #pragma omp parallel
       8    #pragma omp single
       9    {
      10      #pragma omp task shared (x) depend(out: x)
      11      x = 2;
      12      #pragma omp task shared (x) depend(in: x)
      13      if (x != 2)
      14        abort ();
      15    }
      16  }
      17  
      18  void
      19  dep2 (void)
      20  {
      21    #pragma omp parallel
      22    #pragma omp single
      23    {
      24      int x = 1;
      25      #pragma omp task shared (x) depend(out: x)
      26      x = 2;
      27      #pragma omp task shared (x) depend(in: x)
      28      if (x != 2)
      29        abort ();
      30      #pragma omp taskwait
      31    }
      32  }
      33  
      34  void
      35  dep3 (void)
      36  {
      37    #pragma omp parallel
      38    {
      39      int x = 1;
      40      #pragma omp single
      41      {
      42        #pragma omp task shared (x) depend(out: x)
      43        x = 2;
      44        #pragma omp task shared (x) depend(in: x)
      45        if (x != 2)
      46  	abort ();
      47      }
      48    }
      49  }
      50  
      51  void
      52  firstpriv (void)
      53  {
      54    #pragma omp parallel
      55    #pragma omp single
      56    {
      57      int x = 1;
      58      #pragma omp task depend(out: x)
      59      x = 2;
      60      #pragma omp task depend(in: x)
      61      if (x != 1)
      62        abort ();
      63    }
      64  }
      65  
      66  void
      67  antidep (void)
      68  {
      69    int x = 1;
      70    #pragma omp parallel
      71    #pragma omp single
      72    {
      73      #pragma omp task shared(x) depend(in: x)
      74      if (x != 1)
      75        abort ();
      76      #pragma omp task shared(x) depend(out: x)
      77      x = 2;
      78    }
      79  }
      80  
      81  void
      82  antidep2 (void)
      83  {
      84    #pragma omp parallel
      85    #pragma omp single
      86    {
      87      int x = 1;
      88      #pragma omp taskgroup
      89      {
      90        #pragma omp task shared(x) depend(in: x)
      91        if (x != 1)
      92  	abort ();
      93        #pragma omp task shared(x) depend(out: x)
      94        x = 2;
      95      }
      96    }
      97  }
      98  
      99  void
     100  antidep3 (void)
     101  {
     102    #pragma omp parallel
     103    {
     104      int x = 1;
     105      #pragma omp single
     106      {
     107        #pragma omp task shared(x) depend(in: x)
     108        if (x != 1)
     109  	abort ();
     110        #pragma omp task shared(x) depend(out: x)
     111        x = 2;
     112      }
     113    }
     114  }
     115  
     116  
     117  void
     118  outdep (void)
     119  {
     120    #pragma omp parallel
     121    #pragma omp single
     122    {
     123      int x = 0;
     124      #pragma omp task shared(x) depend(out: x)
     125      x = 1;
     126      #pragma omp task shared(x) depend(out: x)
     127      x = 2;
     128      #pragma omp taskwait
     129      if (x != 2)
     130        abort ();
     131    }
     132  }
     133  
     134  void
     135  concurrent (void)
     136  {
     137    int x = 1;
     138    #pragma omp parallel
     139    #pragma omp single
     140    {
     141      #pragma omp task shared (x) depend(out: x)
     142      x = 2;
     143      #pragma omp task shared (x) depend(in: x)
     144      if (x != 2)
     145        abort ();
     146      #pragma omp task shared (x) depend(in: x)
     147      if (x != 2)
     148        abort ();
     149      #pragma omp task shared (x) depend(in: x)
     150      if (x != 2)
     151        abort ();
     152    }
     153  }
     154  
     155  void
     156  concurrent2 (void)
     157  {
     158    #pragma omp parallel
     159    #pragma omp single
     160    {
     161      int x = 1;
     162      #pragma omp task shared (x) depend(out: x)
     163      x = 2;
     164      #pragma omp task shared (x) depend(in: x)
     165      if (x != 2)
     166        abort ();
     167      #pragma omp task shared (x) depend(in: x)
     168      if (x != 2)
     169        abort ();
     170      #pragma omp task shared (x) depend(in: x)
     171      if (x != 2)
     172        abort ();
     173      #pragma omp taskwait
     174    }
     175  }
     176  
     177  void
     178  concurrent3 (void)
     179  {
     180    #pragma omp parallel
     181    {
     182      int x = 1;
     183      #pragma omp single
     184      {
     185        #pragma omp task shared (x) depend(out: x)
     186        x = 2;
     187        #pragma omp task shared (x) depend(in: x)
     188        if (x != 2)
     189  	abort ();
     190        #pragma omp task shared (x) depend(in: x)
     191        if (x != 2)
     192  	abort ();
     193        #pragma omp task shared (x) depend(in: x)
     194        if (x != 2)
     195  	abort ();
     196      }
     197    }
     198  }
     199  
     200  int
     201  main ()
     202  {
     203    dep ();
     204    dep2 ();
     205    dep3 ();
     206    firstpriv ();
     207    antidep ();
     208    antidep2 ();
     209    antidep3 ();
     210    outdep ();
     211    concurrent ();
     212    concurrent2 ();
     213    concurrent3 ();
     214    return 0;
     215  }