1 /* { dg-do run { target tls_runtime } } */
2 /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
3
4 #include <stdlib.h>
5 #include <omp.h>
6
7 int t;
8 #pragma omp threadprivate (t)
9
10 int
11 main ()
12 {
13 int a = 0, i;
14 #pragma omp parallel
15 #pragma omp taskgroup
16 {
17 #pragma omp task
18 {
19 #pragma omp cancel taskgroup
20 if (omp_get_cancellation ())
21 abort ();
22 }
23 #pragma omp taskwait
24 #pragma omp for reduction (task, +: a)
25 for (i = 0; i < 64; ++i)
26 {
27 a++;
28 #pragma omp task in_reduction (+: a)
29 {
30 volatile int zero = 0;
31 a += zero;
32 if (omp_get_cancellation ())
33 abort ();
34 }
35 }
36 if (a != 64)
37 abort ();
38 #pragma omp task
39 {
40 if (omp_get_cancellation ())
41 abort ();
42 }
43 }
44 a = 0;
45 #pragma omp parallel
46 #pragma omp taskgroup
47 {
48 int p;
49 #pragma omp for reduction (task, +: a)
50 for (i = 0; i < 64; ++i)
51 {
52 a++;
53 t = 1;
54 #pragma omp task in_reduction (+: a)
55 {
56 volatile int zero = 0;
57 a += zero;
58 #pragma omp cancel taskgroup
59 if (omp_get_cancellation ())
60 abort ();
61 }
62 }
63 if (a != 64)
64 abort ();
65 p = t;
66 #pragma omp task firstprivate (p)
67 {
68 if (p && omp_get_cancellation ())
69 abort ();
70 }
71 }
72 return 0;
73 }