1// { dg-do run }
2
3extern "C" void abort ();
4int x = 6, cnt;
5
6int
7foo ()
8{
9  return cnt++;
10}
11
12int
13main ()
14{
15  int v, *p;
16  #pragma omp atomic update
17    x = x + 7;
18  #pragma omp atomic
19    x = x + 7 + 6;
20  #pragma omp atomic update
21    x = x + 2 * 3;
22  #pragma omp atomic
23    x = x * (2 - 1);
24  #pragma omp atomic read
25    v = x;
26  if (v != 32)
27    abort ();
28  #pragma omp atomic write
29    x = 0;
30  #pragma omp atomic capture
31    {
32      v = x;
33      x = x | 1 ^ 2;
34    }
35  if (v != 0)
36    abort ();
37  #pragma omp atomic capture
38    {
39      v = x;
40      x = x | 4 | 2;
41    }
42  if (v != 3)
43    abort ();
44  #pragma omp atomic read
45    v = x;
46  if (v != 7)
47    abort ();
48  #pragma omp atomic capture
49    {
50      x = x ^ 6 & 2;
51      v = x;
52    }
53  if (v != 5)
54    abort ();
55  #pragma omp atomic capture
56    { x = x - (6 + 4); v = x; }
57  if (v != -5)
58    abort ();
59  #pragma omp atomic capture
60    { v = x; x = x - (1 | 2); }
61  if (v != -5)
62    abort ();
63  #pragma omp atomic read
64    v = x;
65  if (v != -8)
66    abort ();
67  #pragma omp atomic
68    x = x * -4 / 2;
69  #pragma omp atomic read
70    v = x;
71  if (v != 16)
72    abort ();
73  p = &x;
74  #pragma omp atomic update
75    p[foo (), 0] = p[foo (), 0] - 16;
76  #pragma omp atomic read
77    v = x;
78  if (cnt != 2 || v != 0)
79    abort ();
80  #pragma omp atomic capture
81    {
82      p[foo (), 0] += 6;
83      v = p[foo (), 0];
84    }
85  if (cnt != 4 || v != 6)
86    abort ();
87  #pragma omp atomic capture
88    {
89      v = p[foo (), 0];
90      p[foo (), 0] += 6;
91    }
92  if (cnt != 6 || v != 6)
93    abort ();
94  #pragma omp atomic read
95    v = x;
96  if (v != 12)
97    abort ();
98  #pragma omp atomic capture
99    {
100      p[foo (), 0] = p[foo (), 0] + 6;
101      v = p[foo (), 0];
102    }
103  if (cnt != 9 || v != 18)
104    abort ();
105  #pragma omp atomic capture
106    {
107      v = p[foo (), 0];
108      p[foo (), 0] = p[foo (), 0] + 6;
109    }
110  if (cnt != 12 || v != 18)
111    abort ();
112  #pragma omp atomic read
113    v = x;
114  if (v != 24)
115    abort ();
116  #pragma omp atomic capture
117  { v = p[foo (), 0]; p[foo (), 0]++; }
118  #pragma omp atomic capture
119  { v = p[foo (), 0]; ++p[foo (), 0]; }
120  #pragma omp atomic capture
121  { p[foo (), 0]++; v = p[foo (), 0]; }
122  #pragma omp atomic capture
123  { ++p[foo (), 0]; v = p[foo (), 0]; }
124  if (cnt != 20 || v != 28)
125    abort ();
126  #pragma omp atomic capture
127  { v = p[foo (), 0]; p[foo (), 0]--; }
128  #pragma omp atomic capture
129  { v = p[foo (), 0]; --p[foo (), 0]; }
130  #pragma omp atomic capture
131  { p[foo (), 0]--; v = p[foo (), 0]; }
132  #pragma omp atomic capture
133  { --p[foo (), 0]; v = p[foo (), 0]; }
134  if (cnt != 28 || v != 24)
135    abort ();
136  return 0;
137}
138