1// PR c++/36308
2// { dg-do run }
3
4extern "C" void abort ();
5
6static int n;
7
8struct A
9{
10  A ()
11  {
12    l = 0;
13    #pragma omp atomic
14      ctors++;
15  }
16  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  }
29  virtual ~A ()
30  {
31    #pragma omp atomic
32      dtors++;
33  }
34  int l;
35  static int ctors, dtors, copyctors, assignops;
36};
37
38int A::ctors;
39int A::dtors;
40int A::copyctors;
41int A::assignops;
42
43int
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