1// { dg-do run } 2 3#include <omp.h> 4extern "C" void abort (); 5 6int l = 5; 7 8int 9foo (int i) 10{ 11 int j = 7; 12 const int k = 8; 13 #pragma omp task firstprivate (i) shared (j, l) 14 { 15 #pragma omp critical 16 { 17 j += i; 18 l += k; 19 } 20 } 21 i++; 22 #pragma omp task firstprivate (i) shared (j, l) 23 { 24 #pragma omp critical 25 { 26 j += i; 27 l += k; 28 } 29 } 30 i++; 31 #pragma omp task firstprivate (i) shared (j, l) 32 { 33 #pragma omp critical 34 { 35 j += i; 36 l += k; 37 } 38 } 39 i++; 40 #pragma omp task firstprivate (i) shared (j, l) 41 { 42 #pragma omp critical 43 { 44 j += i; 45 l += k; 46 } 47 } 48 i++; 49 #pragma omp taskwait 50 return (i != 8 * omp_get_thread_num () + 4 51 || j != 4 * i - 3 52 || k != 8); 53} 54 55int 56main (void) 57{ 58 int r = 0; 59 #pragma omp parallel num_threads (4) reduction(+:r) 60 if (omp_get_num_threads () != 4) 61 { 62 #pragma omp master 63 l = 133; 64 } 65 else if (foo (8 * omp_get_thread_num ())) 66 r++; 67 if (r || l != 133) 68 abort (); 69 return 0; 70} 71