| // PR c++/36308 |
| // { dg-do run } |
| |
| extern "C" void abort (); |
| |
| static int n; |
| |
| struct A |
| { |
| A () |
| { |
| l = 0; |
| #pragma omp atomic |
| ctors++; |
| } |
| A (const A &x) |
| { |
| l = x.l; |
| #pragma omp atomic |
| copyctors++; |
| } |
| virtual A& operator= (const A &x) |
| { |
| l = x.l; |
| #pragma omp atomic |
| assignops++; |
| return *this; |
| } |
| virtual ~A () |
| { |
| #pragma omp atomic |
| dtors++; |
| } |
| int l; |
| static int ctors, dtors, copyctors, assignops; |
| }; |
| |
| int A::ctors; |
| int A::dtors; |
| int A::copyctors; |
| int A::assignops; |
| |
| int |
| main () |
| { |
| A a; |
| #pragma omp parallel private (a) |
| { |
| a.l = 6; |
| #pragma omp single copyprivate (a) |
| { |
| a.l = 3; |
| } |
| if (a.l != 3) |
| abort (); |
| #pragma omp atomic |
| n++; |
| } |
| if (A::ctors != n + 1 |
| || A::copyctors != 0 |
| || A::dtors != n |
| || A::assignops != n - 1) |
| abort (); |
| return 0; |
| } |