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