1 // { dg-do run }
2 
3 #include <omp.h>
4 #include <assert.h>
5 
6 struct 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 
19 int B::icount;
20 int B::dcount;
21 int B::xcount;
22 
B()23 B::B()
24 {
25   #pragma omp atomic
26     icount++;
27 }
28 
~B()29 B::~B()
30 {
31   #pragma omp atomic
32     dcount++;
33 }
34 
doit()35 void B::doit()
36 {
37   #pragma omp atomic
38     xcount++;
39 }
40 
41 static int nthreads;
42 
foo()43 void 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 
main()54 int 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