xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c++/ctor-4.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 ecount;
11*404b540aSrobert   static B *e_inner;
12*404b540aSrobert   static B *e_outer;
13*404b540aSrobert 
14*404b540aSrobert   B();
15*404b540aSrobert   B(int);
16*404b540aSrobert   B(const B &);
17*404b540aSrobert   ~B();
18*404b540aSrobert   B& operator=(const B &);
19*404b540aSrobert   void doit();
20*404b540aSrobert };
21*404b540aSrobert 
22*404b540aSrobert int B::ccount;
23*404b540aSrobert int B::dcount;
24*404b540aSrobert int B::ecount;
25*404b540aSrobert B * B::e_inner;
26*404b540aSrobert B * B::e_outer;
27*404b540aSrobert 
B(int)28*404b540aSrobert B::B(int)
29*404b540aSrobert {
30*404b540aSrobert   e_outer = this;
31*404b540aSrobert }
32*404b540aSrobert 
B(const B & b)33*404b540aSrobert B::B(const B &b)
34*404b540aSrobert {
35*404b540aSrobert   assert (&b == e_outer);
36*404b540aSrobert   #pragma omp atomic
37*404b540aSrobert     ccount++;
38*404b540aSrobert }
39*404b540aSrobert 
~B()40*404b540aSrobert B::~B()
41*404b540aSrobert {
42*404b540aSrobert   #pragma omp atomic
43*404b540aSrobert     dcount++;
44*404b540aSrobert }
45*404b540aSrobert 
46*404b540aSrobert B& B::operator= (const B &b)
47*404b540aSrobert {
48*404b540aSrobert   assert (&b == e_inner);
49*404b540aSrobert   assert (this == e_outer);
50*404b540aSrobert   #pragma omp atomic
51*404b540aSrobert     ecount++;
52*404b540aSrobert   return *this;
53*404b540aSrobert }
54*404b540aSrobert 
doit()55*404b540aSrobert void B::doit()
56*404b540aSrobert {
57*404b540aSrobert   #pragma omp critical
58*404b540aSrobert     {
59*404b540aSrobert       assert (e_inner == 0);
60*404b540aSrobert       e_inner = this;
61*404b540aSrobert     }
62*404b540aSrobert }
63*404b540aSrobert 
64*404b540aSrobert static int nthreads;
65*404b540aSrobert 
foo()66*404b540aSrobert void foo()
67*404b540aSrobert {
68*404b540aSrobert   B b(0);
69*404b540aSrobert 
70*404b540aSrobert   #pragma omp parallel sections firstprivate(b) lastprivate(b)
71*404b540aSrobert     {
72*404b540aSrobert     #pragma omp section
73*404b540aSrobert       nthreads = omp_get_num_threads ();
74*404b540aSrobert     #pragma omp section
75*404b540aSrobert       b.doit ();
76*404b540aSrobert     }
77*404b540aSrobert }
78*404b540aSrobert 
main()79*404b540aSrobert int main()
80*404b540aSrobert {
81*404b540aSrobert   omp_set_dynamic (0);
82*404b540aSrobert   omp_set_num_threads (4);
83*404b540aSrobert   foo();
84*404b540aSrobert 
85*404b540aSrobert   assert (B::ecount == 1);
86*404b540aSrobert   assert (B::ccount == nthreads);
87*404b540aSrobert   assert (B::dcount == nthreads+1);
88*404b540aSrobert 
89*404b540aSrobert   return 0;
90*404b540aSrobert }
91