xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c++/pr30703.C (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert // PR c++/30703
2*404b540aSrobert // { dg-do run }
3*404b540aSrobert 
4*404b540aSrobert #include <omp.h>
5*404b540aSrobert 
6*404b540aSrobert extern "C" void abort ();
7*404b540aSrobert 
8*404b540aSrobert int ctor, cctor, dtor;
9*404b540aSrobert 
10*404b540aSrobert struct A
11*404b540aSrobert {
12*404b540aSrobert   A();
13*404b540aSrobert   A(const A &);
14*404b540aSrobert   ~A();
15*404b540aSrobert   int i;
16*404b540aSrobert };
17*404b540aSrobert 
A()18*404b540aSrobert A::A()
19*404b540aSrobert {
20*404b540aSrobert #pragma omp atomic
21*404b540aSrobert   ctor++;
22*404b540aSrobert }
23*404b540aSrobert 
A(const A & r)24*404b540aSrobert A::A(const A &r)
25*404b540aSrobert {
26*404b540aSrobert   i = r.i;
27*404b540aSrobert #pragma omp atomic
28*404b540aSrobert   cctor++;
29*404b540aSrobert }
30*404b540aSrobert 
~A()31*404b540aSrobert A::~A()
32*404b540aSrobert {
33*404b540aSrobert #pragma omp atomic
34*404b540aSrobert   dtor++;
35*404b540aSrobert }
36*404b540aSrobert 
37*404b540aSrobert void
foo(A a,A b)38*404b540aSrobert foo (A a, A b)
39*404b540aSrobert {
40*404b540aSrobert   int i, j = 0;
41*404b540aSrobert #pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
42*404b540aSrobert   for (i = 0; i < 5; i++)
43*404b540aSrobert     {
44*404b540aSrobert       b.i = 5;
45*404b540aSrobert       if (a.i != 6)
46*404b540aSrobert 	#pragma omp atomic
47*404b540aSrobert 	  j += 1;
48*404b540aSrobert       a.i = b.i + i + 6;
49*404b540aSrobert     }
50*404b540aSrobert 
51*404b540aSrobert   if (j || a.i != 15)
52*404b540aSrobert     abort ();
53*404b540aSrobert }
54*404b540aSrobert 
55*404b540aSrobert void
bar()56*404b540aSrobert bar ()
57*404b540aSrobert {
58*404b540aSrobert   A a, b;
59*404b540aSrobert   a.i = 6;
60*404b540aSrobert   b.i = 7;
61*404b540aSrobert   foo (a, b);
62*404b540aSrobert }
63*404b540aSrobert 
64*404b540aSrobert int
main()65*404b540aSrobert main ()
66*404b540aSrobert {
67*404b540aSrobert   omp_set_dynamic (false);
68*404b540aSrobert   if (ctor || cctor || dtor)
69*404b540aSrobert     abort ();
70*404b540aSrobert   bar ();
71*404b540aSrobert   if (ctor + cctor != dtor)
72*404b540aSrobert     abort ();
73*404b540aSrobert }
74