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*404b540aSrobertA::A() 19*404b540aSrobert { 20*404b540aSrobert #pragma omp atomic 21*404b540aSrobert ctor++; 22*404b540aSrobert } 23*404b540aSrobert A(const A & r)24*404b540aSrobertA::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*404b540aSrobertA::~A() 32*404b540aSrobert { 33*404b540aSrobert #pragma omp atomic 34*404b540aSrobert dtor++; 35*404b540aSrobert } 36*404b540aSrobert 37*404b540aSrobert void foo(A a,A b)38*404b540aSrobertfoo (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*404b540aSrobertbar () 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*404b540aSrobertmain () 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