// PR middle-end/27337 // { dg-do run } #include extern "C" void abort (void); struct S { S (); ~S (); S (const S &); int i; }; int n[3]; S::S () : i(18) { if (omp_get_thread_num () != 0) #pragma omp atomic n[0]++; } S::~S () { if (omp_get_thread_num () != 0) #pragma omp atomic n[1]++; } S::S (const S &x) { if (x.i != 18) abort (); i = 118; if (omp_get_thread_num () != 0) #pragma omp atomic n[2]++; } S foo () { int i; S ret; #pragma omp parallel for firstprivate (ret) lastprivate (ret) \ schedule (static, 1) num_threads (4) for (i = 0; i < 4; i++) ret.i += omp_get_thread_num (); return ret; } S bar () { int i; S ret; #pragma omp parallel for num_threads (4) for (i = 0; i < 4; i++) #pragma omp atomic ret.i += omp_get_thread_num () + 1; return ret; } S x; int main (void) { omp_set_dynamic (false); x = foo (); if (n[0] != 0 || n[1] != 3 || n[2] != 3) abort (); if (x.i != 118 + 3) abort (); x = bar (); if (n[0] != 0 || n[1] != 3 || n[2] != 3) abort (); if (x.i != 18 + 0 + 1 + 2 + 3 + 4) abort (); return 0; }