| // PR c++/30703 |
| // { dg-do run } |
| |
| #include <omp.h> |
| |
| extern "C" void abort (); |
| |
| int ctor, cctor, dtor; |
| |
| struct A |
| { |
| A(); |
| A(const A &); |
| ~A(); |
| int i; |
| }; |
| |
| A::A() |
| { |
| #pragma omp atomic |
| ctor++; |
| } |
| |
| A::A(const A &r) |
| { |
| i = r.i; |
| #pragma omp atomic |
| cctor++; |
| } |
| |
| A::~A() |
| { |
| #pragma omp atomic |
| dtor++; |
| } |
| |
| void |
| foo (A a, A b) |
| { |
| int i, j = 0; |
| #pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5) |
| for (i = 0; i < 5; i++) |
| { |
| b.i = 5; |
| if (a.i != 6) |
| #pragma omp atomic |
| j += 1; |
| a.i = b.i + i + 6; |
| } |
| |
| if (j || a.i != 15) |
| abort (); |
| } |
| |
| void |
| bar () |
| { |
| A a, b; |
| a.i = 6; |
| b.i = 7; |
| foo (a, b); |
| } |
| |
| int |
| main () |
| { |
| omp_set_dynamic (false); |
| if (ctor || cctor || dtor) |
| abort (); |
| bar (); |
| if (ctor + cctor != dtor) |
| abort (); |
| } |