1 /* { dg-do run } */
2
3 extern
4 #ifdef __cplusplus
5 "C"
6 #endif
7 void abort (void);
8 float x = 6.0f;
9
10 int
11 main ()
12 {
13 float v;
14 int r;
15 #pragma omp atomic compare
16 x = x > 8.0f ? 8.0f : x;
17 #pragma omp atomic read
18 v = x;
19 if (v != 6.0f)
20 abort ();
21 #pragma omp atomic compare
22 x = x > 4.0f ? 4.0f : x;
23 #pragma omp atomic read
24 v = x;
25 if (v != 4.0f)
26 abort ();
27 #pragma omp atomic compare capture
28 v = x = x < 8.0f ? 8.0f : x;
29 if (v != 8.0f)
30 abort ();
31 #pragma omp atomic read
32 v = x;
33 if (v != 8)
34 abort ();
35 #pragma omp atomic capture compare
36 { v = x; x = x < 12.0f ? 12.0f : x; }
37 if (v != 8.0f)
38 abort ();
39 #pragma omp atomic read
40 v = x;
41 if (v != 12.0f)
42 abort ();
43 #pragma omp atomic capture compare
44 { v = x; x = x < 4.0f ? 4.0f : x; }
45 if (v != 12.0f)
46 abort ();
47 #pragma omp atomic read
48 v = x;
49 if (v != 12.0f)
50 abort ();
51 #pragma omp atomic compare
52 x = x == 12.0 ? 16.0L : x;
53 #pragma omp atomic read
54 v = x;
55 if (v != 16.0)
56 abort ();
57 r = 57;
58 #pragma omp atomic compare capture
59 v = x = x == 15.0f ? r + 7.0f : x;
60 if (v != 16.0f)
61 abort ();
62 #pragma omp atomic read
63 v = x;
64 if (v != 16.0f)
65 abort ();
66 #pragma omp atomic capture, update, compare seq_cst fail(acquire)
67 { v = x; x = x == 73.0L - r ? 12.0f : x; }
68 if (v != 16.0f)
69 abort ();
70 #pragma omp atomic read
71 v = x;
72 if (v != 12.0f)
73 abort ();
74 #pragma omp atomic update, compare, capture
75 { x = x == 69.0 - r ? 6.0f : x; v = x; }
76 if (v != 6.0f)
77 abort ();
78 #pragma omp atomic read
79 v = x;
80 if (v != 6.0f)
81 abort ();
82 #pragma omp atomic compare
83 if (x > 8.0f) { x = 8.0f; }
84 #pragma omp atomic read
85 v = x;
86 if (v != 6.0f)
87 abort ();
88 #pragma omp atomic compare
89 if (x > 4.0) { x = 4.0; }
90 #pragma omp atomic read
91 v = x;
92 if (v != 4.0f)
93 abort ();
94 #pragma omp atomic compare capture
95 { if (x < 8.0f) { x = 8.0f; } v = x; }
96 if (v != 8.0f)
97 abort ();
98 #pragma omp atomic read
99 v = x;
100 if (v != 8.0f)
101 abort ();
102 #pragma omp atomic capture compare
103 { v = x; if (x < 12.0f) { x = 12.0f; } }
104 if (v != 8.0f)
105 abort ();
106 #pragma omp atomic read
107 v = x;
108 if (v != 12.0f)
109 abort ();
110 #pragma omp atomic capture compare
111 { v = x; if (x < 4.0L) { x = 4.0L; } }
112 if (v != 12.0f)
113 abort ();
114 #pragma omp atomic read
115 v = x;
116 if (v != 12.0f)
117 abort ();
118 #pragma omp atomic compare
119 if (x == 12.0f) { x = 16.0L; }
120 #pragma omp atomic read
121 v = x;
122 if (v != 16.0f)
123 abort ();
124 r = 57.0;
125 #pragma omp atomic compare capture
126 { if (x == 15.0f) { x = r + 7.0f; } v = x; }
127 if (v != 16.0f)
128 abort ();
129 #pragma omp atomic read
130 v = x;
131 if (v != 16.0f)
132 abort ();
133 #pragma omp atomic capture, update, compare seq_cst fail(acquire)
134 { v = x; if (x == 73.0L - r) { x = 12.0L; } }
135 if (v != 16.0f)
136 abort ();
137 #pragma omp atomic read
138 v = x;
139 if (v != 12.0f)
140 abort ();
141 #pragma omp atomic update, compare, capture
142 { if (x == 69.0L - r) { x = 6.0; } v = x; }
143 if (v != 6.0f)
144 abort ();
145 #pragma omp atomic read
146 v = x;
147 if (v != 6.0f)
148 abort ();
149 v = 24;
150 #pragma omp atomic compare capture
151 if (x == 12.0f) { x = 16.0f; } else { v = x; }
152 if (v != 6.0f)
153 abort ();
154 v = 32.0f;
155 #pragma omp atomic read
156 v = x;
157 if (v != 6.0f)
158 abort ();
159 v = 147.0f;
160 #pragma omp atomic capture compare
161 if (x == 6.0f) { x = 57.0f; } else { v = x; }
162 if (v != 147.0f)
163 abort ();
164 #pragma omp atomic read
165 v = x;
166 if (v != 57.0f)
167 abort ();
168 #pragma omp atomic update, capture, compare, weak, seq_cst, fail (relaxed)
169 { r = x == 137.0f; if (r) { x = 174.0f; } }
170 if (r)
171 abort ();
172 #pragma omp atomic read
173 v = x;
174 if (v != 57.0f)
175 abort ();
176 #pragma omp atomic compare capture fail (relaxed)
177 { r = x == 57.0f; if (r) { x = 6.0f; } }
178 if (r != 1)
179 abort ();
180 #pragma omp atomic read
181 v = x;
182 if (v != 6.0f)
183 abort ();
184 v = -5.0f;
185 #pragma omp atomic capture compare
186 { r = x == 17.0L; if (r) { x = 25.0; } else { v = x; } }
187 if (r || v != 6.0f)
188 abort ();
189 #pragma omp atomic read
190 v = x;
191 if (v != 6.0f)
192 abort ();
193 v = 15.0f;
194 #pragma omp atomic capture compare
195 { r = x == 6.0f; if (r) { x = 23.0f; } else { v = x; } }
196 if (r != 1 || v != 15.0f)
197 abort ();
198 #pragma omp atomic read
199 v = x;
200 if (v != 23.0f)
201 abort ();
202 return 0;
203 }