|  | #include <omp.h> | 
|  |  | 
|  | __attribute__((noinline, noclone)) void | 
|  | foo (int &b) | 
|  | { | 
|  | #pragma omp parallel | 
|  | #pragma omp single | 
|  | { | 
|  | bool f = false; | 
|  | #pragma omp taskloop firstprivate (b, f) | 
|  | for (int i = 0; i < 30; i++) | 
|  | { | 
|  | int q = omp_get_thread_num (); | 
|  | if (!f) | 
|  | { | 
|  | if (b != 2) | 
|  | __builtin_abort (); | 
|  | } | 
|  | else if (b != 8 * q) | 
|  | __builtin_abort (); | 
|  | b = 8 * q; | 
|  | f = true; | 
|  | } | 
|  | } | 
|  | int n; | 
|  | #pragma omp parallel | 
|  | #pragma omp single | 
|  | { | 
|  | bool f = false; | 
|  | #pragma omp taskloop firstprivate (f) lastprivate (b, n) | 
|  | for (int i = 0; i < 30; i++) | 
|  | { | 
|  | int q = omp_get_thread_num (); | 
|  | if (f && b != 8 * q) | 
|  | __builtin_abort (); | 
|  | b = 8 * q; | 
|  | n = q; | 
|  | f = true; | 
|  | } | 
|  | } | 
|  | if (b != 8 * n) | 
|  | __builtin_abort (); | 
|  | b = 9; | 
|  | #pragma omp parallel | 
|  | #pragma omp single | 
|  | { | 
|  | bool f = false; | 
|  | #pragma omp taskloop firstprivate (b, f) lastprivate (b, n) | 
|  | for (int i = 0; i < 30; i++) | 
|  | { | 
|  | int q = omp_get_thread_num (); | 
|  | if (!f) | 
|  | { | 
|  | if (b != 9) | 
|  | __builtin_abort (); | 
|  | } | 
|  | else if (b != 11 * q) | 
|  | __builtin_abort (); | 
|  | b = 11 * q; | 
|  | n = q; | 
|  | f = true; | 
|  | } | 
|  | } | 
|  | if (b != 11 * n) | 
|  | __builtin_abort (); | 
|  | } | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | int b = 2; | 
|  | foo (b); | 
|  | } |