Update concepts branch to revision 131834
[official-gcc.git] / libgomp / testsuite / libgomp.c++ / pr30703.C
blobd48efd952d4fa7e3cd7e2887c13f7045be559f6a
1 // PR c++/30703
2 // { dg-do run }
4 #include <omp.h>
6 extern "C" void abort ();
8 int ctor, cctor, dtor;
10 struct A
12   A();
13   A(const A &);
14   ~A();
15   int i;
18 A::A()
20 #pragma omp atomic
21   ctor++;
24 A::A(const A &r)
26   i = r.i;
27 #pragma omp atomic
28   cctor++;
31 A::~A()
33 #pragma omp atomic
34   dtor++;
37 void
38 foo (A a, A b)
40   int i, j = 0;
41 #pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
42   for (i = 0; i < 5; i++)
43     {
44       b.i = 5;
45       if (a.i != 6)
46         #pragma omp atomic
47           j += 1;
48       a.i = b.i + i + 6;
49     }
51   if (j || a.i != 15)
52     abort ();
55 void
56 bar ()
58   A a, b;
59   a.i = 6;
60   b.i = 7;
61   foo (a, b);
64 int
65 main ()
67   omp_set_dynamic (false);
68   if (ctor || cctor || dtor)
69     abort ();
70   bar ();
71   if (ctor + cctor != dtor)
72     abort ();