xref: /llvm-project/openmp/runtime/test/tasking/task_reduction1.c (revision 4457565757ea91207b7e5f2ce7b7bf173bfd2c0c)
1 // RUN: %libomp-compile-and-run
2 
3 // UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7, gcc-8
4 
5 #include <stdio.h>
6 #include <stdlib.h>
7 
8 int a = 0, b = 1;
9 
main(int argc,char ** argv)10 int main(int argc, char **argv) {
11 
12   #pragma omp parallel
13   #pragma omp single
14   {
15     #pragma omp taskgroup task_reduction(+: a) task_reduction(*: b)
16     {
17       int i;
18       for (i = 1; i <= 5; ++i) {
19         #pragma omp task in_reduction(+: a) in_reduction(*: b)
20         {
21           a += i;
22           b *= i;
23           #pragma omp task in_reduction(+: a)
24           {
25             a += i;
26           }
27         }
28       }
29     }
30   }
31 
32   if (a != 30) {
33     fprintf(stderr, "error: a != 30. Instead a = %d\n", a);
34     exit(EXIT_FAILURE);
35   }
36   if (b != 120) {
37     fprintf(stderr, "error: b != 120. Instead b = %d\n", b);
38     exit(EXIT_FAILURE);
39   }
40 
41   return EXIT_SUCCESS;
42 }
43