| // 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; | |
| } |