1// { dg-do run }
2
3#include <omp.h>
4#include <assert.h>
5
6struct B
7{
8  static int icount;
9  static int dcount;
10  static int xcount;
11
12  B();
13  B(const B &);
14  ~B();
15  B& operator=(const B &);
16  void doit();
17};
18
19int B::icount;
20int B::dcount;
21int B::xcount;
22
23B::B()
24{
25  #pragma omp atomic
26    icount++;
27}
28
29B::~B()
30{
31  #pragma omp atomic
32    dcount++;
33}
34
35void B::doit()
36{
37  #pragma omp atomic
38    xcount++;
39}
40
41static int nthreads;
42
43void foo()
44{
45  B b;
46  #pragma omp parallel private(b)
47    {
48      #pragma omp master
49	nthreads = omp_get_num_threads ();
50      b.doit();
51    }
52}
53
54int main()
55{
56  omp_set_dynamic (0);
57  omp_set_num_threads (4);
58  foo();
59
60  assert (B::xcount == nthreads);
61  assert (B::icount == nthreads+1);
62  assert (B::dcount == nthreads+1);
63
64  return 0;
65}
66