xref: /llvm-project/openmp/runtime/test/tasking/issue-87307.c (revision 4ea24946e356be31446fc30ca3d11cc5783ba2a6)
1 // RUN: %libomp-compile-and-run
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <omp.h>
5 
6 int a;
7 
inc_a()8 void inc_a() {
9 #pragma omp task
10   {
11 #pragma omp atomic
12     a++;
13   }
14 }
15 
main()16 int main() {
17   int n;
18   int nth_outer;
19   omp_set_max_active_levels(2);
20   omp_set_dynamic(0);
21 
22   for (n = 0; n < 200; ++n) {
23     a = 0;
24 #pragma omp parallel num_threads(8)
25     {
26       if (omp_get_thread_num() == 0)
27         nth_outer = omp_get_num_threads();
28 #pragma omp parallel num_threads(2)
29       {
30         int i;
31 #pragma omp master
32         for (i = 0; i < 50; ++i)
33           inc_a();
34       }
35     }
36     if (a != nth_outer * 50) {
37       fprintf(stderr, "error: a (%d) != %d\n", a, nth_outer * 50);
38       return EXIT_FAILURE;
39     }
40   }
41 
42   return EXIT_SUCCESS;
43 }
44