1// { dg-do run } 2// { dg-require-effective-target tls_runtime } 3 4#include <omp.h> 5#include <assert.h> 6 7struct B 8{ 9 static int count; 10 static B *expected; 11 12 B& operator=(const B &); 13}; 14 15int B::count; 16B * B::expected; 17 18static B thr; 19#pragma omp threadprivate(thr) 20 21B& B::operator= (const B &b) 22{ 23 assert (&b == expected); 24 assert (this != expected); 25 #pragma omp atomic 26 count++; 27 return *this; 28} 29 30static int nthreads; 31 32void foo() 33{ 34 B::expected = &thr; 35 36 #pragma omp parallel copyin(thr) 37 { 38 #pragma omp master 39 nthreads = omp_get_num_threads (); 40 } 41} 42 43int main() 44{ 45 omp_set_dynamic (0); 46 omp_set_num_threads (4); 47 foo(); 48 49 assert (B::count == nthreads-1); 50 51 return 0; 52} 53