| // { dg-do run } |
| |
| extern "C" void abort (); |
| int x = 6, cnt; |
| |
| int |
| foo () |
| { |
| return cnt++; |
| } |
| |
| int |
| main () |
| { |
| int v, *p; |
| #pragma omp atomic update |
| x = x + 7; |
| #pragma omp atomic |
| x = x + 7 + 6; |
| #pragma omp atomic update |
| x = x + 2 * 3; |
| #pragma omp atomic |
| x = x * (2 - 1); |
| #pragma omp atomic read |
| v = x; |
| if (v != 32) |
| abort (); |
| #pragma omp atomic write |
| x = 0; |
| #pragma omp atomic capture |
| { |
| v = x; |
| x = x | 1 ^ 2; |
| } |
| if (v != 0) |
| abort (); |
| #pragma omp atomic capture |
| { |
| v = x; |
| x = x | 4 | 2; |
| } |
| if (v != 3) |
| abort (); |
| #pragma omp atomic read |
| v = x; |
| if (v != 7) |
| abort (); |
| #pragma omp atomic capture |
| { |
| x = x ^ 6 & 2; |
| v = x; |
| } |
| if (v != 5) |
| abort (); |
| #pragma omp atomic capture |
| { x = x - (6 + 4); v = x; } |
| if (v != -5) |
| abort (); |
| #pragma omp atomic capture |
| { v = x; x = x - (1 | 2); } |
| if (v != -5) |
| abort (); |
| #pragma omp atomic read |
| v = x; |
| if (v != -8) |
| abort (); |
| #pragma omp atomic |
| x = x * -4 / 2; |
| #pragma omp atomic read |
| v = x; |
| if (v != 16) |
| abort (); |
| p = &x; |
| #pragma omp atomic update |
| p[foo (), 0] = p[foo (), 0] - 16; |
| #pragma omp atomic read |
| v = x; |
| if (cnt != 2 || v != 0) |
| abort (); |
| #pragma omp atomic capture |
| { |
| p[foo (), 0] += 6; |
| v = p[foo (), 0]; |
| } |
| if (cnt != 4 || v != 6) |
| abort (); |
| #pragma omp atomic capture |
| { |
| v = p[foo (), 0]; |
| p[foo (), 0] += 6; |
| } |
| if (cnt != 6 || v != 6) |
| abort (); |
| #pragma omp atomic read |
| v = x; |
| if (v != 12) |
| abort (); |
| #pragma omp atomic capture |
| { |
| p[foo (), 0] = p[foo (), 0] + 6; |
| v = p[foo (), 0]; |
| } |
| if (cnt != 9 || v != 18) |
| abort (); |
| #pragma omp atomic capture |
| { |
| v = p[foo (), 0]; |
| p[foo (), 0] = p[foo (), 0] + 6; |
| } |
| if (cnt != 12 || v != 18) |
| abort (); |
| #pragma omp atomic read |
| v = x; |
| if (v != 24) |
| abort (); |
| #pragma omp atomic capture |
| { v = p[foo (), 0]; p[foo (), 0]++; } |
| #pragma omp atomic capture |
| { v = p[foo (), 0]; ++p[foo (), 0]; } |
| #pragma omp atomic capture |
| { p[foo (), 0]++; v = p[foo (), 0]; } |
| #pragma omp atomic capture |
| { ++p[foo (), 0]; v = p[foo (), 0]; } |
| if (cnt != 20 || v != 28) |
| abort (); |
| #pragma omp atomic capture |
| { v = p[foo (), 0]; p[foo (), 0]--; } |
| #pragma omp atomic capture |
| { v = p[foo (), 0]; --p[foo (), 0]; } |
| #pragma omp atomic capture |
| { p[foo (), 0]--; v = p[foo (), 0]; } |
| #pragma omp atomic capture |
| { --p[foo (), 0]; v = p[foo (), 0]; } |
| if (cnt != 28 || v != 24) |
| abort (); |
| return 0; |
| } |