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