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