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