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