1 // PR c++/36308 2 // { dg-do run } 3 4 extern "C" void abort (); 5 6 static int n; 7 8 struct A 9 { AA10 A () 11 { 12 l = 0; 13 #pragma omp atomic 14 ctors++; 15 } AA16 A (const A &x) 17 { 18 l = x.l; 19 #pragma omp atomic 20 copyctors++; 21 } 22 virtual A& operator= (const A &x) 23 { 24 l = x.l; 25 #pragma omp atomic 26 assignops++; 27 return *this; 28 } ~AA29 virtual ~A () 30 { 31 #pragma omp atomic 32 dtors++; 33 } 34 int l; 35 static int ctors, dtors, copyctors, assignops; 36 }; 37 38 int A::ctors; 39 int A::dtors; 40 int A::copyctors; 41 int A::assignops; 42 43 int main()44main () 45 { 46 A a; 47 #pragma omp parallel private (a) 48 { 49 a.l = 6; 50 #pragma omp single copyprivate (a) 51 { 52 a.l = 3; 53 } 54 if (a.l != 3) 55 abort (); 56 #pragma omp atomic 57 n++; 58 } 59 if (A::ctors != n + 1 60 || A::copyctors != 0 61 || A::dtors != n 62 || A::assignops != n - 1) 63 abort (); 64 return 0; 65 } 66