12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // 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 ();
- }
|