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