|  | // { dg-do run } | 
|  |  | 
|  | extern "C" void abort (void); | 
|  |  | 
|  | template <typename T> | 
|  | void | 
|  | foo () | 
|  | { | 
|  | extern T x; | 
|  | T v, l = 2, s = 1; | 
|  | #pragma omp atomic | 
|  | x = -3 + x; | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != 3) | 
|  | abort (); | 
|  | #pragma omp atomic update | 
|  | x = 3 * 2 * 1 + x; | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != 9) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | v = x = x | 16; | 
|  | if (v != 25) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | v = x = x + 14 * 2 / 4; | 
|  | if (v != 32) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | v = x = 5 | x; | 
|  | if (v != 37) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | v = x = 40 + 12 - 2 - 7 - x; | 
|  | if (v != 6) | 
|  | abort (); | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != 6) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { v = x; x = 3 + x; } | 
|  | if (v != 6) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { v = x; x = -1 * -1 * -1 * -1 - x; } | 
|  | if (v != 9) | 
|  | abort (); | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != -8) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { x = 2 * 2 - x; v = x; } | 
|  | if (v != 12) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { x = 7 & x; v = x; } | 
|  | if (v != 4) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { v = x; x = 6; } | 
|  | if (v != 4) | 
|  | abort (); | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != 6) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { v = x; x = 7 * 8 + 23; } | 
|  | if (v != 6) | 
|  | abort (); | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != 79) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { v = x; x = 23 + 6 * 4; } | 
|  | if (v != 79) | 
|  | abort (); | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != 47) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { v = x; x = l ? 17 : 12; } | 
|  | if (v != 47) | 
|  | abort (); | 
|  | #pragma omp atomic capture | 
|  | { v = x; x = l = s++ + 3; } | 
|  | if (v != 17 || l != 4 || s != 2) | 
|  | abort (); | 
|  | #pragma omp atomic read | 
|  | v = x; | 
|  | if (v != 4) | 
|  | abort (); | 
|  | } | 
|  |  | 
|  | int x = 6; | 
|  |  | 
|  | int | 
|  | main () | 
|  | { | 
|  | foo <int> (); | 
|  | return 0; | 
|  | } |