re PR c++/86443 (ICEs on #pragma omp distribute parallel for with class iterators)
[gcc.git] / libgomp / testsuite / libgomp.c / pr61200.c
1 /* PR libgomp/61200 */
2 /* { dg-do run } */
3
4 #include <omp.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7
8 volatile int x;
9
10 void
11 foo ()
12 {
13 int var = 1;
14 int i;
15
16 for (i = 0; i < 2; i++)
17 {
18 if (i == 1)
19 {
20 #pragma omp parallel num_threads(2)
21 if (x)
22 var++;
23 else
24 {
25 #pragma omp single
26 sleep (2);
27 }
28 }
29 else
30 {
31 #pragma omp task shared(var)
32 {
33 sleep (1);
34 var = 2;
35 }
36 }
37 }
38 #pragma omp taskwait
39 if (var != 2)
40 abort ();
41 }
42
43 void
44 bar ()
45 {
46 int var = 1;
47 int i;
48
49 for (i = 0; i < 2; i++)
50 {
51 if (i == 0)
52 {
53 #pragma omp task shared(var)
54 {
55 sleep (1);
56 var = 2;
57 }
58 }
59 else
60 {
61 #pragma omp parallel num_threads(2)
62 if (x)
63 var++;
64 else
65 {
66 #pragma omp single
67 sleep (2);
68 }
69 }
70 }
71 #pragma omp taskwait
72 if (var != 2)
73 abort ();
74 }
75
76 int
77 main ()
78 {
79 omp_set_nested (1);
80 #pragma omp parallel num_threads(2)
81 #pragma omp single
82 foo ();
83 #pragma omp parallel num_threads(2)
84 #pragma omp single
85 bar ();
86 return 0;
87 }