1// { dg-do run }
2
3extern "C" void abort (void);
4
5template <typename T>
6void
7foo ()
8{
9  extern T v, x1, x2, x3, x4, x5, x6;
10  #pragma omp atomic capture
11  v = ++x1;
12  if (!v)
13    abort ();
14  #pragma omp atomic capture
15  v = x2++;
16  if (v)
17    abort ();
18  #pragma omp atomic read
19  v = x3;
20  if (!v)
21    abort ();
22  #pragma omp atomic read
23  v = x4;
24  if (!v)
25    abort ();
26  #pragma omp atomic capture
27  { v = x5; x5 |= 1; }
28  if (v)
29    abort ();
30  #pragma omp atomic capture
31  { x6 |= 1; v = x6; }
32  if (!v)
33    abort ();
34}
35
36template <typename T>
37void
38bar ()
39{
40  extern T v, x1, x2;
41  #pragma omp atomic write
42  x1 = false;
43  #pragma omp atomic write
44  x2 = false;
45  #pragma omp atomic capture
46  { ++x1; v = x1; }
47  if (!v)
48    abort ();
49  #pragma omp atomic capture
50  { v = x2; x2++; }
51  if (v)
52    abort ();
53  #pragma omp atomic write
54  x1 = false;
55  #pragma omp atomic write
56  x2 = false;
57  #pragma omp atomic capture
58  { x1++; v = x1; }
59  if (!v)
60    abort ();
61  #pragma omp atomic capture
62  { v = x2; ++x2; }
63  if (v)
64    abort ();
65}
66
67bool v, x1, x2, x3, x4, x5, x6;
68
69int
70main ()
71{
72  #pragma omp atomic write
73  x3 = true;
74  #pragma omp atomic write
75  x4 = true;
76  foo <bool> ();
77  bar <bool> ();
78  return 0;
79}
80