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