1*404b540aSrobert // { dg-do run } 2*404b540aSrobert 3*404b540aSrobert #include <omp.h> 4*404b540aSrobert #include <assert.h> 5*404b540aSrobert 6*404b540aSrobert struct B 7*404b540aSrobert { 8*404b540aSrobert static int ccount; 9*404b540aSrobert static int dcount; 10*404b540aSrobert static int ecount; 11*404b540aSrobert static B *e_inner; 12*404b540aSrobert static B *e_outer; 13*404b540aSrobert 14*404b540aSrobert B(); 15*404b540aSrobert B(int); 16*404b540aSrobert B(const B &); 17*404b540aSrobert ~B(); 18*404b540aSrobert B& operator=(const B &); 19*404b540aSrobert void doit(); 20*404b540aSrobert }; 21*404b540aSrobert 22*404b540aSrobert int B::ccount; 23*404b540aSrobert int B::dcount; 24*404b540aSrobert int B::ecount; 25*404b540aSrobert B * B::e_inner; 26*404b540aSrobert B * B::e_outer; 27*404b540aSrobert B(int)28*404b540aSrobertB::B(int) 29*404b540aSrobert { 30*404b540aSrobert e_outer = this; 31*404b540aSrobert } 32*404b540aSrobert B(const B & b)33*404b540aSrobertB::B(const B &b) 34*404b540aSrobert { 35*404b540aSrobert assert (&b == e_outer); 36*404b540aSrobert #pragma omp atomic 37*404b540aSrobert ccount++; 38*404b540aSrobert } 39*404b540aSrobert ~B()40*404b540aSrobertB::~B() 41*404b540aSrobert { 42*404b540aSrobert #pragma omp atomic 43*404b540aSrobert dcount++; 44*404b540aSrobert } 45*404b540aSrobert 46*404b540aSrobert B& B::operator= (const B &b) 47*404b540aSrobert { 48*404b540aSrobert assert (&b == e_inner); 49*404b540aSrobert assert (this == e_outer); 50*404b540aSrobert #pragma omp atomic 51*404b540aSrobert ecount++; 52*404b540aSrobert return *this; 53*404b540aSrobert } 54*404b540aSrobert doit()55*404b540aSrobertvoid B::doit() 56*404b540aSrobert { 57*404b540aSrobert #pragma omp critical 58*404b540aSrobert { 59*404b540aSrobert assert (e_inner == 0); 60*404b540aSrobert e_inner = this; 61*404b540aSrobert } 62*404b540aSrobert } 63*404b540aSrobert 64*404b540aSrobert static int nthreads; 65*404b540aSrobert foo()66*404b540aSrobertvoid foo() 67*404b540aSrobert { 68*404b540aSrobert B b(0); 69*404b540aSrobert 70*404b540aSrobert #pragma omp parallel sections firstprivate(b) lastprivate(b) 71*404b540aSrobert { 72*404b540aSrobert #pragma omp section 73*404b540aSrobert nthreads = omp_get_num_threads (); 74*404b540aSrobert #pragma omp section 75*404b540aSrobert b.doit (); 76*404b540aSrobert } 77*404b540aSrobert } 78*404b540aSrobert main()79*404b540aSrobertint main() 80*404b540aSrobert { 81*404b540aSrobert omp_set_dynamic (0); 82*404b540aSrobert omp_set_num_threads (4); 83*404b540aSrobert foo(); 84*404b540aSrobert 85*404b540aSrobert assert (B::ecount == 1); 86*404b540aSrobert assert (B::ccount == nthreads); 87*404b540aSrobert assert (B::dcount == nthreads+1); 88*404b540aSrobert 89*404b540aSrobert return 0; 90*404b540aSrobert } 91