/* { dg-do run } */ extern void abort (void); int x = 6, cnt; int foo (void) { 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; }