(root)/
gcc-13.2.0/
libgomp/
testsuite/
libgomp.c-c++-common/
task-reduction-4.c
       1  extern
       2  #ifdef __cplusplus
       3  "C"
       4  #endif
       5  void abort (void);
       6  
       7  void
       8  bar (long long int *p)
       9  {
      10    p[0] *= 2;
      11    #pragma omp task in_reduction (*: p[0])
      12    p[0] *= 3;
      13  }
      14  
      15  void
      16  foo (long long int *p, long long int *q)
      17  {
      18    #pragma omp taskgroup task_reduction (*: p[0])
      19    {
      20      #pragma omp task in_reduction (*: p[0])
      21      bar (p);
      22      #pragma omp task in_reduction (*: p[0])
      23      bar (p);
      24      bar (p);
      25      #pragma omp taskgroup task_reduction (*: q[0])
      26      {
      27        #pragma omp task in_reduction (*: q[0])
      28        bar (q);
      29        #pragma omp task in_reduction (*: q[0])
      30        bar (q);
      31        #pragma omp task in_reduction (*: q[0])
      32        bar (q);
      33        bar (q);
      34        #pragma omp task in_reduction (*: p[0])
      35        {
      36  	#pragma omp taskgroup task_reduction (*: p[0])
      37  	{
      38  	  #pragma omp task in_reduction (*: p[0])
      39  	  bar (p);
      40  	  p[0] *= 2;
      41  	  #pragma omp task in_reduction (*: p[0])
      42  	  bar (p);
      43  	}
      44        }
      45      }
      46    }
      47  }
      48  
      49  int
      50  main ()
      51  {
      52    long long int p = 1LL, q = 1LL;
      53    foo (&p, &q);
      54    if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
      55      abort ();
      56    p = 1LL;
      57    q = 1LL;
      58    #pragma omp taskgroup
      59    foo (&p, &q);
      60    if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
      61      abort ();
      62    p = 1LL;
      63    q = 1LL;
      64    #pragma omp parallel
      65    #pragma omp single
      66    foo (&p, &q);
      67    if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
      68      abort ();
      69    return 0;
      70  }