(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
cancel-taskgroup-3.c
       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  }