1 // PR c++/36308
2 // { dg-do run }
3 
4 #include <omp.h>
5 #include <assert.h>
6 
7 #define N 10
8 
9 struct B
10 {
11   static int icount;
12   static int ccount;
13   static int dcount;
14   static int xcount;
15 
16   B ();
17   B (const B &);
18   virtual ~B ();
19   B& operator= (const B &);
20   void doit ();
clearB21   static void clear () { icount = ccount = dcount = xcount = 0; }
22 };
23 
24 int B::icount;
25 int B::ccount;
26 int B::dcount;
27 int B::xcount;
28 
B()29 B::B ()
30 {
31   #pragma omp atomic
32     icount++;
33 }
34 
B(const B &)35 B::B (const B &)
36 {
37   #pragma omp atomic
38     ccount++;
39 }
40 
~B()41 B::~B ()
42 {
43   #pragma omp atomic
44     dcount++;
45 }
46 
47 void
doit()48 B::doit ()
49 {
50   #pragma omp atomic
51     xcount++;
52 }
53 
54 static int nthreads;
55 
56 void
test1()57 test1 ()
58 {
59   B b[N];
60   #pragma omp parallel private (b)
61     {
62       #pragma omp master
63 	nthreads = omp_get_num_threads ();
64       b[0].doit ();
65     }
66 }
67 
68 void
test2()69 test2 ()
70 {
71   B b;
72   #pragma omp parallel firstprivate (b)
73     {
74       #pragma omp single
75 	nthreads = omp_get_num_threads ();
76       b.doit ();
77     }
78 }
79 
80 int
main()81 main ()
82 {
83   omp_set_dynamic (0);
84   omp_set_num_threads (4);
85 
86   B::clear ();
87   test1 ();
88   assert (B::xcount == nthreads);
89   assert (B::ccount == 0);
90   assert (B::icount == (nthreads + 1) * N);
91   assert (B::dcount == (nthreads + 1) * N);
92 
93   B::clear ();
94   test2 ();
95   assert (B::xcount == nthreads);
96   assert (B::ccount == nthreads);
97   assert (B::icount == 1);
98   assert (B::dcount == nthreads + 1);
99   return 0;
100 }
101