74 lines
819 B
C
74 lines
819 B
C
// PR c++/30703
|
|
// { dg-do run }
|
|
|
|
#include <omp.h>
|
|
|
|
extern "C" void abort ();
|
|
|
|
int ctor, cctor, dtor;
|
|
|
|
struct A
|
|
{
|
|
A();
|
|
A(const A &);
|
|
~A();
|
|
int i;
|
|
};
|
|
|
|
A::A()
|
|
{
|
|
#pragma omp atomic
|
|
ctor++;
|
|
}
|
|
|
|
A::A(const A &r)
|
|
{
|
|
i = r.i;
|
|
#pragma omp atomic
|
|
cctor++;
|
|
}
|
|
|
|
A::~A()
|
|
{
|
|
#pragma omp atomic
|
|
dtor++;
|
|
}
|
|
|
|
void
|
|
foo (A a, A b)
|
|
{
|
|
int i, j = 0;
|
|
#pragma omp parallel for firstprivate (a) lastprivate (a) private (b) schedule (static, 1) num_threads (5)
|
|
for (i = 0; i < 5; i++)
|
|
{
|
|
b.i = 5;
|
|
if (a.i != 6)
|
|
#pragma omp atomic
|
|
j += 1;
|
|
a.i = b.i + i + 6;
|
|
}
|
|
|
|
if (j || a.i != 15)
|
|
abort ();
|
|
}
|
|
|
|
void
|
|
bar ()
|
|
{
|
|
A a, b;
|
|
a.i = 6;
|
|
b.i = 7;
|
|
foo (a, b);
|
|
}
|
|
|
|
int
|
|
main ()
|
|
{
|
|
omp_set_dynamic (false);
|
|
if (ctor || cctor || dtor)
|
|
abort ();
|
|
bar ();
|
|
if (ctor + cctor != dtor)
|
|
abort ();
|
|
}
|