1// { dg-do run }
2// { dg-set-target-env-var OMP_CANCELLATION "true" }
3
4#include <unistd.h>
5#include <omp.h>
6#include "cancel-test.h"
7
8void
9foo ()
10{
11  S a, b, c, d, e, f;
12  #pragma omp parallel private (c, d) firstprivate (e, f)
13  #pragma omp taskgroup
14  {
15    c.bump ();
16    e.bump ();
17    #pragma omp task firstprivate (b, f) private (d)
18    {
19      S h;
20      b.bump ();
21      d.bump ();
22      f.bump ();
23      #pragma omp cancel taskgroup
24      if (omp_get_cancellation ())
25	abort ();
26    }
27  }
28  #pragma omp parallel private (c, d) firstprivate (e, f)
29  {
30    #pragma omp barrier
31    #pragma omp single
32    #pragma omp taskgroup
33    {
34      int i;
35      c.bump ();
36      e.bump ();
37      for (i = 0; i < 50; i++)
38	#pragma omp task firstprivate (b, f) private (d)
39	{
40	  S h;
41	  b.bump ();
42	  d.bump ();
43	  f.bump ();
44	  #pragma omp cancellation point taskgroup
45	  usleep (30);
46	  #pragma omp cancel taskgroup if (i > 5)
47	}
48    }
49    usleep (10);
50  }
51}
52
53int
54main ()
55{
56  foo ();
57  S::verify ();
58}
59