// PR c++/30703 // { dg-do run } #include 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 (); }