| // RUN: %libomp-compile-and-run | |
| // XFAIL: icc | |
| // UNSUPPORTED: clang-4, clang-5, clang-6, clang-7, clang-8, clang-9, clang-10 | |
| // UNSUPPORTED: gcc-4, gcc-5, gcc-6, gcc-7, gcc-8 | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| int a = 0, b = 1; | |
| int main(int argc, char **argv) { | |
| #pragma omp parallel | |
| { | |
| #pragma omp sections reduction(task, +: a) reduction(task, *: b) | |
| { | |
| #pragma omp section | |
| { | |
| #pragma omp task in_reduction(+: a) in_reduction(*: b) | |
| { | |
| a += 1; | |
| b *= 1; | |
| } | |
| } | |
| #pragma omp section | |
| { | |
| #pragma omp task in_reduction(+: a) in_reduction(*: b) | |
| { | |
| a += 2; | |
| b *= 2; | |
| } | |
| } | |
| #pragma omp section | |
| { | |
| #pragma omp task in_reduction(+: a) in_reduction(*: b) | |
| { | |
| a += 3; | |
| b *= 3; | |
| } | |
| } | |
| #pragma omp section | |
| { | |
| #pragma omp task in_reduction(+: a) in_reduction(*: b) | |
| { | |
| a += 4; | |
| b *= 4; | |
| } | |
| } | |
| #pragma omp section | |
| { | |
| #pragma omp task in_reduction(+: a) in_reduction(*: b) | |
| { | |
| a += 5; | |
| b *= 5; | |
| } | |
| } | |
| } | |
| } | |
| if (a != 15) { | |
| fprintf(stderr, "error: a != 15. Instead a = %d\n", a); | |
| exit(EXIT_FAILURE); | |
| } | |
| if (b != 120) { | |
| fprintf(stderr, "error: b != 120. Instead b = %d\n", b); | |
| exit(EXIT_FAILURE); | |
| } | |
| return EXIT_SUCCESS; | |
| } |