| // { dg-do run } | |
| extern "C" void abort (); | |
| struct A | |
| { | |
| A (); | |
| ~A (); | |
| A (const A &); | |
| unsigned long l; | |
| }; | |
| int e; | |
| A::A () | |
| { | |
| l = 17; | |
| } | |
| A::~A () | |
| { | |
| if (l > 30) | |
| #pragma omp atomic | |
| e++; | |
| } | |
| A::A (const A &r) | |
| { | |
| l = r.l; | |
| } | |
| void | |
| check (int i, A &a, int j, A &b) | |
| { | |
| if (i != 6 || a.l != 21 || j != 0 || b.l != 23) | |
| #pragma omp atomic | |
| e++; | |
| } | |
| A b; | |
| int j; | |
| void | |
| foo (int i) | |
| { | |
| A a; | |
| a.l = 21; | |
| #pragma omp task firstprivate (i, a, j, b) | |
| check (i, a, j, b); | |
| } | |
| void | |
| bar (int i, A a) | |
| { | |
| a.l = 21; | |
| #pragma omp task firstprivate (i, a, j, b) | |
| check (i, a, j, b); | |
| } | |
| A | |
| baz () | |
| { | |
| A a, c; | |
| a.l = 21; | |
| c.l = 23; | |
| #pragma omp task firstprivate (a, c) | |
| check (6, a, 0, c); | |
| return a; | |
| } | |
| int | |
| main () | |
| { | |
| b.l = 23; | |
| foo (6); | |
| bar (6, A ()); | |
| baz (); | |
| #pragma omp parallel num_threads (4) | |
| { | |
| #pragma omp single | |
| for (int i = 0; i < 64; i++) | |
| { | |
| foo (6); | |
| bar (6, A ()); | |
| baz (); | |
| } | |
| } | |
| if (e) | |
| abort (); | |
| } |