| // { dg-do run } |
| |
| extern "C" void abort (void); |
| |
| template <typename T> |
| void |
| foo () |
| { |
| extern T v, x1, x2, x3, x4, x5, x6; |
| #pragma omp atomic capture |
| v = ++x1; |
| if (!v) |
| abort (); |
| #pragma omp atomic capture |
| v = x2++; |
| if (v) |
| abort (); |
| #pragma omp atomic read |
| v = x3; |
| if (!v) |
| abort (); |
| #pragma omp atomic read |
| v = x4; |
| if (!v) |
| abort (); |
| #pragma omp atomic capture |
| { v = x5; x5 |= 1; } |
| if (v) |
| abort (); |
| #pragma omp atomic capture |
| { x6 |= 1; v = x6; } |
| if (!v) |
| abort (); |
| } |
| |
| template <typename T> |
| void |
| bar () |
| { |
| extern T v, x1, x2; |
| #pragma omp atomic write |
| x1 = false; |
| #pragma omp atomic write |
| x2 = false; |
| #pragma omp atomic capture |
| { ++x1; v = x1; } |
| if (!v) |
| abort (); |
| #pragma omp atomic capture |
| { v = x2; x2++; } |
| if (v) |
| abort (); |
| #pragma omp atomic write |
| x1 = false; |
| #pragma omp atomic write |
| x2 = false; |
| #pragma omp atomic capture |
| { x1++; v = x1; } |
| if (!v) |
| abort (); |
| #pragma omp atomic capture |
| { v = x2; ++x2; } |
| if (v) |
| abort (); |
| } |
| |
| bool v, x1, x2, x3, x4, x5, x6; |
| |
| int |
| main () |
| { |
| #pragma omp atomic write |
| x3 = true; |
| #pragma omp atomic write |
| x4 = true; |
| foo <bool> (); |
| bar <bool> (); |
| return 0; |
| } |