1 // PR c++/30703 2 // { dg-do run } 3 4 #include <omp.h> 5 6 extern "C" void abort (); 7 8 int ctor, cctor, dtor; 9 10 struct A 11 { 12 A(); 13 A(const A &); 14 ~A(); 15 int i; 16 }; 17 A()18A::A() 19 { 20 #pragma omp atomic 21 ctor++; 22 } 23 A(const A & r)24A::A(const A &r) 25 { 26 i = r.i; 27 #pragma omp atomic 28 cctor++; 29 } 30 ~A()31A::~A() 32 { 33 #pragma omp atomic 34 dtor++; 35 } 36 37 void foo(A a,A b)38foo (A a, A b) 39 { 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 } 50 51 if (j || a.i != 15) 52 abort (); 53 } 54 55 void bar()56bar () 57 { 58 A a, b; 59 a.i = 6; 60 b.i = 7; 61 foo (a, b); 62 } 63 64 int main()65main () 66 { 67 omp_set_dynamic (false); 68 if (ctor || cctor || dtor) 69 abort (); 70 bar (); 71 if (ctor + cctor != dtor) 72 abort (); 73 } 74