1// { dg-do run } 2 3extern "C" void abort (); 4 5struct A 6{ 7 A (); 8 ~A (); 9 A (const A &); 10 unsigned long l; 11}; 12 13int e; 14 15A::A () 16{ 17 l = 17; 18} 19 20A::~A () 21{ 22 if (l > 130) 23 #pragma omp atomic 24 e++; 25} 26 27A::A (const A &r) 28{ 29 l = r.l + 64; 30} 31 32void 33check (int i, A &a, int j, A &b) 34{ 35 if (i != 6 || a.l != 21 + 64 || j != 0 || b.l != 23 + 64) 36 #pragma omp atomic 37 e++; 38} 39 40A b; 41int j; 42 43void 44foo (int i) 45{ 46 A a; 47 a.l = 21; 48 #pragma omp task firstprivate (j, b) 49 check (i, a, j, b); 50} 51 52void 53bar (int i, A a) 54{ 55 a.l = 21; 56 #pragma omp task firstprivate (j, b) 57 check (i, a, j, b); 58} 59 60A 61baz () 62{ 63 A a, c; 64 a.l = 21; 65 c.l = 23; 66 #pragma omp task firstprivate (a, c) 67 check (6, a, 0, c); 68 return a; 69} 70 71int 72main () 73{ 74 b.l = 23; 75 foo (6); 76 bar (6, A ()); 77 baz (); 78 #pragma omp parallel num_threads (4) 79 { 80 #pragma omp single 81 for (int i = 0; i < 64; i++) 82 { 83 foo (6); 84 bar (6, A ()); 85 baz (); 86 } 87 } 88 if (e) 89 abort (); 90} 91