// RUN: %clang %openmp_flags %flags-use-compiler-omp-h %s -o %t && %libomp-run // UNSUPPORTED: gcc-5, gcc-6, gcc-7, gcc-8 // UNSUPPORTED: clang-5, clang-6, clang-7, clang-8, clang-9, clang-10 // UNSUPPORTED: icc #include #include #include #include "omp_my_sleep.h" int a, b; void mutexinoutset_task() { if (b != 0) { fprintf(stderr, "mutexinoutset_task: b != 0 at start of task\n"); exit(EXIT_FAILURE); } b++; if (b != 1) { fprintf(stderr, "mutexinoutset_task: b != 1\n"); exit(EXIT_FAILURE); } my_sleep(0.1); b--; if (b != 0) { fprintf(stderr, "mutexinoutset_task: b != 0 at end of task\n"); exit(EXIT_FAILURE); } } int main(int argc, char** argv) { omp_depend_t dep_a_in; omp_depend_t dep_a_out; omp_depend_t dep_a_inout; omp_depend_t dep_a_mutexinoutset; a = 0; b = 0; #pragma omp depobj(dep_a_in) depend(in: a) #pragma omp depobj(dep_a_out) depend(out: a) #pragma omp depobj(dep_a_inout) depend(inout: a) #pragma omp depobj(dep_a_mutexinoutset) depend(mutexinoutset: a) #pragma omp parallel { #pragma omp single { #pragma omp task depend(depobj: dep_a_out) { my_sleep(0.1); a = 10; } #pragma omp task depend(depobj: dep_a_inout) { my_sleep(0.1); a++; } #pragma omp task depend(depobj: dep_a_mutexinoutset) mutexinoutset_task(); #pragma omp task depend(depobj: dep_a_mutexinoutset) mutexinoutset_task(); #pragma omp task depend(depobj: dep_a_mutexinoutset) mutexinoutset_task(); #pragma omp task depend(depobj: dep_a_mutexinoutset) mutexinoutset_task(); #pragma omp task depend(depobj: dep_a_mutexinoutset) mutexinoutset_task(); #pragma omp task depend(depobj: dep_a_in) { a += 10; } } } if (a != 21) { fprintf(stderr, "a (%d) != 21\n", a); exit(EXIT_FAILURE); } #pragma omp depobj(dep_a_in) destroy #pragma omp depobj(dep_a_out) destroy #pragma omp depobj(dep_a_inout) destroy #pragma omp depobj(dep_a_mutexinoutset) destroy return EXIT_SUCCESS; }