xref: /llvm-project/openmp/runtime/test/tasking/task_reduction3.c (revision 4457565757ea91207b7e5f2ce7b7bf173bfd2c0c)
1 // RUN: %libomp-compile-and-run
2 
3 // XFAIL: icc
4 // UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8, clang-9, clang-10
5 // UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7, gcc-8
6 
7 #include <stdio.h>
8 #include <stdlib.h>
9 
10 int a = 0, b = 1;
11 
main(int argc,char ** argv)12 int main(int argc, char **argv) {
13 
14   #pragma omp parallel
15   {
16     #pragma omp sections reduction(task, +: a) reduction(task, *: b)
17     {
18       #pragma omp section
19       {
20         #pragma omp task in_reduction(+: a) in_reduction(*: b)
21         {
22           a += 1;
23           b *= 1;
24         }
25       }
26       #pragma omp section
27       {
28         #pragma omp task in_reduction(+: a) in_reduction(*: b)
29         {
30           a += 2;
31           b *= 2;
32         }
33       }
34       #pragma omp section
35       {
36         #pragma omp task in_reduction(+: a) in_reduction(*: b)
37         {
38           a += 3;
39           b *= 3;
40         }
41       }
42       #pragma omp section
43       {
44         #pragma omp task in_reduction(+: a) in_reduction(*: b)
45         {
46           a += 4;
47           b *= 4;
48         }
49       }
50       #pragma omp section
51       {
52         #pragma omp task in_reduction(+: a) in_reduction(*: b)
53         {
54           a += 5;
55           b *= 5;
56         }
57       }
58     }
59   }
60 
61   if (a != 15) {
62     fprintf(stderr, "error: a != 15. Instead a = %d\n", a);
63     exit(EXIT_FAILURE);
64   }
65   if (b != 120) {
66     fprintf(stderr, "error: b != 120. Instead b = %d\n", b);
67     exit(EXIT_FAILURE);
68   }
69 
70   return EXIT_SUCCESS;
71 }
72