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 icount; 9*404b540aSrobert static int dcount; 10*404b540aSrobert static int xcount; 11*404b540aSrobert 12*404b540aSrobert B(); 13*404b540aSrobert B(const B &); 14*404b540aSrobert ~B(); 15*404b540aSrobert B& operator=(const B &); 16*404b540aSrobert void doit(); 17*404b540aSrobert }; 18*404b540aSrobert 19*404b540aSrobert int B::icount; 20*404b540aSrobert int B::dcount; 21*404b540aSrobert int B::xcount; 22*404b540aSrobert B()23*404b540aSrobertB::B() 24*404b540aSrobert { 25*404b540aSrobert #pragma omp atomic 26*404b540aSrobert icount++; 27*404b540aSrobert } 28*404b540aSrobert ~B()29*404b540aSrobertB::~B() 30*404b540aSrobert { 31*404b540aSrobert #pragma omp atomic 32*404b540aSrobert dcount++; 33*404b540aSrobert } 34*404b540aSrobert doit()35*404b540aSrobertvoid B::doit() 36*404b540aSrobert { 37*404b540aSrobert #pragma omp atomic 38*404b540aSrobert xcount++; 39*404b540aSrobert } 40*404b540aSrobert 41*404b540aSrobert static int nthreads; 42*404b540aSrobert foo()43*404b540aSrobertvoid foo() 44*404b540aSrobert { 45*404b540aSrobert B b; 46*404b540aSrobert #pragma omp parallel private(b) 47*404b540aSrobert { 48*404b540aSrobert #pragma omp master 49*404b540aSrobert nthreads = omp_get_num_threads (); 50*404b540aSrobert b.doit(); 51*404b540aSrobert } 52*404b540aSrobert } 53*404b540aSrobert main()54*404b540aSrobertint main() 55*404b540aSrobert { 56*404b540aSrobert omp_set_dynamic (0); 57*404b540aSrobert omp_set_num_threads (4); 58*404b540aSrobert foo(); 59*404b540aSrobert 60*404b540aSrobert assert (B::xcount == nthreads); 61*404b540aSrobert assert (B::icount == nthreads+1); 62*404b540aSrobert assert (B::dcount == nthreads+1); 63*404b540aSrobert 64*404b540aSrobert return 0; 65*404b540aSrobert } 66