1 // { dg-do run }
2 
3 extern "C" void abort ();
4 int x = 6, cnt;
5 
6 int
foo()7 foo ()
8 {
9   return cnt++;
10 }
11 
12 int
main()13 main ()
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