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()44 main ()
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