1// { dg-do run }
2
3extern "C" void abort ();
4
5struct A
6{
7  A ();
8  ~A ();
9  A (const A &);
10  unsigned long l;
11};
12
13int e;
14
15A::A ()
16{
17  l = 17;
18}
19
20A::~A ()
21{
22  if (l > 130)
23    #pragma omp atomic
24      e++;
25}
26
27A::A (const A &r)
28{
29  l = r.l + 64;
30}
31
32void
33check (int i, A &a, int j, A &b)
34{
35  if (i != 6 || a.l != 21 + 64 || j != 0 || b.l != 23 + 64)
36    #pragma omp atomic
37      e++;
38}
39
40A b;
41int j;
42
43void
44foo (int i)
45{
46  A a;
47  a.l = 21;
48  #pragma omp task firstprivate (j, b)
49    check (i, a, j, b);
50}
51
52void
53bar (int i, A a)
54{
55  a.l = 21;
56  #pragma omp task firstprivate (j, b)
57    check (i, a, j, b);
58}
59
60A
61baz ()
62{
63  A a, c;
64  a.l = 21;
65  c.l = 23;
66  #pragma omp task firstprivate (a, c)
67    check (6, a, 0, c);
68  return a;
69}
70
71int
72main ()
73{
74  b.l = 23;
75  foo (6);
76  bar (6, A ());
77  baz ();
78  #pragma omp parallel num_threads (4)
79    {
80      #pragma omp single
81	for (int i = 0; i < 64; i++)
82	  {
83	    foo (6);
84	    bar (6, A ());
85	    baz ();
86	  }
87    }
88  if (e)
89    abort ();
90}
91