2015-11-30 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / task-2.C
bloba198cc721b56d540137679e7831509c06668ef6b
1 // { dg-do run }
3 #include <omp.h>
4 extern "C" void abort ();
6 int l = 5;
8 int
9 foo (int i)
11   int j = 7;
12   const int k = 8;
13   #pragma omp task firstprivate (i) shared (j, l)
14   {
15     #pragma omp critical
16       {
17         j += i;
18         l += k;
19       }
20   }
21   i++;
22   #pragma omp task firstprivate (i) shared (j, l)
23   {
24     #pragma omp critical
25       {
26         j += i;
27         l += k;
28       }
29   }
30   i++;
31   #pragma omp task firstprivate (i) shared (j, l)
32   {
33     #pragma omp critical
34       {
35         j += i;
36         l += k;
37       }
38   }
39   i++;
40   #pragma omp task firstprivate (i) shared (j, l)
41   {
42     #pragma omp critical
43       {
44         j += i;
45         l += k;
46       }
47   }
48   i++;
49   #pragma omp taskwait
50   return (i != 8 * omp_get_thread_num () + 4
51           || j != 4 * i - 3
52           || k != 8);
55 int
56 main (void)
58   int r = 0;
59   #pragma omp parallel num_threads (4) reduction(+:r)
60     if (omp_get_num_threads () != 4)
61       {
62         #pragma omp master
63           l = 133;
64       }
65     else if (foo (8 * omp_get_thread_num ()))
66       r++;
67   if (r || l != 133)
68     abort ();
69   return 0;