1*404b540aSrobert // PR middle-end/27337 2*404b540aSrobert // { dg-do run } 3*404b540aSrobert 4*404b540aSrobert #include <omp.h> 5*404b540aSrobert 6*404b540aSrobert extern "C" void abort (void); 7*404b540aSrobert 8*404b540aSrobert struct S 9*404b540aSrobert { 10*404b540aSrobert S (); 11*404b540aSrobert ~S (); 12*404b540aSrobert S (const S &); 13*404b540aSrobert int i; 14*404b540aSrobert }; 15*404b540aSrobert 16*404b540aSrobert int n[3]; 17*404b540aSrobert S()18*404b540aSrobertS::S () : i(18) 19*404b540aSrobert { 20*404b540aSrobert if (omp_get_thread_num () != 0) 21*404b540aSrobert #pragma omp atomic 22*404b540aSrobert n[0]++; 23*404b540aSrobert } 24*404b540aSrobert ~S()25*404b540aSrobertS::~S () 26*404b540aSrobert { 27*404b540aSrobert if (omp_get_thread_num () != 0) 28*404b540aSrobert #pragma omp atomic 29*404b540aSrobert n[1]++; 30*404b540aSrobert } 31*404b540aSrobert S(const S & x)32*404b540aSrobertS::S (const S &x) 33*404b540aSrobert { 34*404b540aSrobert if (x.i != 18) 35*404b540aSrobert abort (); 36*404b540aSrobert i = 118; 37*404b540aSrobert if (omp_get_thread_num () != 0) 38*404b540aSrobert #pragma omp atomic 39*404b540aSrobert n[2]++; 40*404b540aSrobert } 41*404b540aSrobert 42*404b540aSrobert S foo()43*404b540aSrobertfoo () 44*404b540aSrobert { 45*404b540aSrobert int i; 46*404b540aSrobert S ret; 47*404b540aSrobert 48*404b540aSrobert #pragma omp parallel for firstprivate (ret) lastprivate (ret) \ 49*404b540aSrobert schedule (static, 1) num_threads (4) 50*404b540aSrobert for (i = 0; i < 4; i++) 51*404b540aSrobert ret.i += omp_get_thread_num (); 52*404b540aSrobert 53*404b540aSrobert return ret; 54*404b540aSrobert } 55*404b540aSrobert 56*404b540aSrobert S bar()57*404b540aSrobertbar () 58*404b540aSrobert { 59*404b540aSrobert int i; 60*404b540aSrobert S ret; 61*404b540aSrobert 62*404b540aSrobert #pragma omp parallel for num_threads (4) 63*404b540aSrobert for (i = 0; i < 4; i++) 64*404b540aSrobert #pragma omp atomic 65*404b540aSrobert ret.i += omp_get_thread_num () + 1; 66*404b540aSrobert 67*404b540aSrobert return ret; 68*404b540aSrobert } 69*404b540aSrobert 70*404b540aSrobert S x; 71*404b540aSrobert 72*404b540aSrobert int main(void)73*404b540aSrobertmain (void) 74*404b540aSrobert { 75*404b540aSrobert omp_set_dynamic (false); 76*404b540aSrobert x = foo (); 77*404b540aSrobert if (n[0] != 0 || n[1] != 3 || n[2] != 3) 78*404b540aSrobert abort (); 79*404b540aSrobert if (x.i != 118 + 3) 80*404b540aSrobert abort (); 81*404b540aSrobert x = bar (); 82*404b540aSrobert if (n[0] != 0 || n[1] != 3 || n[2] != 3) 83*404b540aSrobert abort (); 84*404b540aSrobert if (x.i != 18 + 0 + 1 + 2 + 3 + 4) 85*404b540aSrobert abort (); 86*404b540aSrobert return 0; 87*404b540aSrobert } 88