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 count; 9*404b540aSrobert static B *expected; 10*404b540aSrobert 11*404b540aSrobert B& operator=(const B &); 12*404b540aSrobert }; 13*404b540aSrobert 14*404b540aSrobert int B::count; 15*404b540aSrobert B * B::expected; 16*404b540aSrobert 17*404b540aSrobert B& B::operator= (const B &b) 18*404b540aSrobert { 19*404b540aSrobert assert (&b == expected); 20*404b540aSrobert assert (this != expected); 21*404b540aSrobert #pragma omp atomic 22*404b540aSrobert count++; 23*404b540aSrobert return *this; 24*404b540aSrobert } 25*404b540aSrobert 26*404b540aSrobert static int nthreads; 27*404b540aSrobert foo()28*404b540aSrobertvoid foo() 29*404b540aSrobert { 30*404b540aSrobert #pragma omp parallel 31*404b540aSrobert { 32*404b540aSrobert B b; 33*404b540aSrobert #pragma omp single copyprivate(b) 34*404b540aSrobert { 35*404b540aSrobert nthreads = omp_get_num_threads (); 36*404b540aSrobert B::expected = &b; 37*404b540aSrobert } 38*404b540aSrobert } 39*404b540aSrobert } 40*404b540aSrobert main()41*404b540aSrobertint main() 42*404b540aSrobert { 43*404b540aSrobert omp_set_dynamic (0); 44*404b540aSrobert omp_set_num_threads (4); 45*404b540aSrobert foo(); 46*404b540aSrobert 47*404b540aSrobert assert (B::count == nthreads-1); 48*404b540aSrobert 49*404b540aSrobert return 0; 50*404b540aSrobert } 51