1 /* { dg-do run } */
2
3 extern
4 #ifdef __cplusplus
5 "C"
6 #endif
7 void abort (void);
8 int x = 6;
9 int w, y;
10
11 int *
12 foo (void)
13 {
14 if (w)
15 abort ();
16 return &y;
17 }
18
19 int
20 main ()
21 {
22 int v, r;
23 #pragma omp atomic compare
24 x = x > 8 ? 8 : x;
25 #pragma omp atomic read
26 v = x;
27 if (v != 6)
28 abort ();
29 #pragma omp atomic compare
30 x = x > 4 ? 4 : x;
31 #pragma omp atomic read
32 v = x;
33 if (v != 4)
34 abort ();
35 #pragma omp atomic compare capture
36 v = x = x < 8 ? 8 : x;
37 if (v != 8)
38 abort ();
39 #pragma omp atomic read
40 v = x;
41 if (v != 8)
42 abort ();
43 #pragma omp atomic capture compare
44 { v = x; x = x < 12 ? 12 : x; }
45 if (v != 8)
46 abort ();
47 #pragma omp atomic read
48 v = x;
49 if (v != 12)
50 abort ();
51 #pragma omp atomic capture compare
52 { v = x; x = x < 4 ? 4 : x; }
53 if (v != 12)
54 abort ();
55 #pragma omp atomic read
56 v = x;
57 if (v != 12)
58 abort ();
59 #pragma omp atomic write
60 x = -32;
61 #pragma omp atomic capture compare seq_cst fail(relaxed)
62 { x = 12U < x ? 12U : x; v = x; }
63 if (v != 12)
64 abort ();
65 #pragma omp atomic read
66 v = x;
67 if (v != 12)
68 abort ();
69 #pragma omp atomic compare
70 x = x == 12 ? 16 : x;
71 #pragma omp atomic read
72 v = x;
73 if (v != 16)
74 abort ();
75 r = 57;
76 #pragma omp atomic compare capture
77 v = x = x == 15 ? r + 7 : x;
78 if (v != 16)
79 abort ();
80 #pragma omp atomic read
81 v = x;
82 if (v != 16)
83 abort ();
84 #pragma omp atomic capture, update, compare seq_cst fail(acquire)
85 { v = x; x = x == 73ULL - r ? 12LL : x; }
86 if (v != 16)
87 abort ();
88 #pragma omp atomic read
89 v = x;
90 if (v != 12)
91 abort ();
92 #pragma omp atomic update, compare, capture
93 { x = x == 69LL - r ? (unsigned char) 6 : x; v = x; }
94 if (v != 6)
95 abort ();
96 #pragma omp atomic read
97 v = x;
98 if (v != 6)
99 abort ();
100 #pragma omp atomic compare
101 if (x > 8) { x = 8; }
102 #pragma omp atomic read
103 v = x;
104 if (v != 6)
105 abort ();
106 #pragma omp atomic compare
107 if (x > 4) { x = 4; }
108 #pragma omp atomic read
109 v = x;
110 if (v != 4)
111 abort ();
112 #pragma omp atomic compare capture
113 { if (x < 8) { x = 8; } v = x; }
114 if (v != 8)
115 abort ();
116 #pragma omp atomic read
117 v = x;
118 if (v != 8)
119 abort ();
120 #pragma omp atomic capture compare
121 { v = x; if (x < 12) { x = 12; } }
122 if (v != 8)
123 abort ();
124 #pragma omp atomic read
125 v = x;
126 if (v != 12)
127 abort ();
128 #pragma omp atomic capture compare
129 { v = x; if (x < 4) { x = 4; } }
130 if (v != 12)
131 abort ();
132 #pragma omp atomic read
133 v = x;
134 if (v != 12)
135 abort ();
136 #pragma omp atomic write
137 x = -32;
138 #pragma omp atomic capture compare seq_cst fail(relaxed)
139 { if (12U < x) { x = 12U; } v = x; }
140 if (v != 12)
141 abort ();
142 #pragma omp atomic read
143 v = x;
144 if (v != 12)
145 abort ();
146 #pragma omp atomic compare
147 if (x == 12) { x = 16; }
148 #pragma omp atomic read
149 v = x;
150 if (v != 16)
151 abort ();
152 r = 57;
153 #pragma omp atomic compare capture
154 { if (x == 15) { x = r + 7; } v = x; }
155 if (v != 16)
156 abort ();
157 #pragma omp atomic read
158 v = x;
159 if (v != 16)
160 abort ();
161 #pragma omp atomic capture, update, compare seq_cst fail(acquire)
162 { v = x; if (x == 73ULL - r) { x = 12LL; } }
163 if (v != 16)
164 abort ();
165 #pragma omp atomic read
166 v = x;
167 if (v != 12)
168 abort ();
169 #pragma omp atomic update, compare, capture
170 { if (x == 69LL - r) { x = (unsigned char) 6; } v = x; }
171 if (v != 6)
172 abort ();
173 #pragma omp atomic read
174 v = x;
175 if (v != 6)
176 abort ();
177 v = 24;
178 #pragma omp atomic compare capture
179 if (x == 12) { x = 16; } else { v = x; }
180 if (v != 6)
181 abort ();
182 v = 32;
183 #pragma omp atomic read
184 v = x;
185 if (v != 6)
186 abort ();
187 v = 147;
188 #pragma omp atomic capture compare
189 if (x == 6) { x = 57; } else { v = x; }
190 if (v != 147)
191 abort ();
192 #pragma omp atomic read
193 v = x;
194 if (v != 57)
195 abort ();
196 #pragma omp atomic update, capture, compare, weak, seq_cst, fail (relaxed)
197 { r = x == 137; if (r) { x = 174; } }
198 if (r)
199 abort ();
200 #pragma omp atomic read
201 v = x;
202 if (v != 57)
203 abort ();
204 #pragma omp atomic compare capture fail (relaxed)
205 { r = x == 57; if (r) { x = 6; } }
206 if (r != 1)
207 abort ();
208 #pragma omp atomic read
209 v = x;
210 if (v != 6)
211 abort ();
212 v = -5;
213 #pragma omp atomic capture compare
214 { r = x == 17; if (r) { x = 25; } else { v = x; } }
215 if (r || v != 6)
216 abort ();
217 #pragma omp atomic read
218 v = x;
219 if (v != 6)
220 abort ();
221 v = 15;
222 #pragma omp atomic capture compare
223 { r = x == 6; if (r) { x = 23; } else { v = x; } }
224 if (r != 1 || v != 15)
225 abort ();
226 #pragma omp atomic read
227 v = x;
228 if (v != 23)
229 abort ();
230 w = 1;
231 #pragma omp atomic compare capture
232 if (x == 23) { x = 57; } else { foo ()[0] = x; }
233 #pragma omp atomic read
234 v = x;
235 if (v != 57)
236 abort ();
237 #pragma omp atomic capture update compare
238 { r = x == 57; if (r) { x = 23; } else { foo ()[0] = x; } }
239 if (r != 1)
240 abort ();
241 #pragma omp atomic read
242 v = x;
243 if (v != 23)
244 abort ();
245 w = 0;
246 #pragma omp atomic compare capture
247 if (x == 24) { x = 57; } else { foo ()[0] = x; }
248 if (y != 23)
249 abort ();
250 #pragma omp atomic read
251 v = x;
252 if (v != 23)
253 abort ();
254 y = -5;
255 #pragma omp atomic capture update compare
256 {
257 r = x == 57;
258 if (r)
259 {
260 x = 27;
261 }
262 else
263 {
264 foo ()[0] = x;
265 }
266 }
267 if (r || y != 23)
268 abort ();
269 #pragma omp atomic read
270 v = x;
271 if (v != 23)
272 abort ();
273 return 0;
274 }