1// { dg-do run } 2 3extern "C" void abort (void); 4 5template <typename T> 6void 7foo () 8{ 9 extern T x; 10 T v, l = 2, s = 1; 11 #pragma omp atomic 12 x = -3 + x; 13 #pragma omp atomic read 14 v = x; 15 if (v != 3) 16 abort (); 17 #pragma omp atomic update 18 x = 3 * 2 * 1 + x; 19 #pragma omp atomic read 20 v = x; 21 if (v != 9) 22 abort (); 23 #pragma omp atomic capture 24 v = x = x | 16; 25 if (v != 25) 26 abort (); 27 #pragma omp atomic capture 28 v = x = x + 14 * 2 / 4; 29 if (v != 32) 30 abort (); 31 #pragma omp atomic capture 32 v = x = 5 | x; 33 if (v != 37) 34 abort (); 35 #pragma omp atomic capture 36 v = x = 40 + 12 - 2 - 7 - x; 37 if (v != 6) 38 abort (); 39 #pragma omp atomic read 40 v = x; 41 if (v != 6) 42 abort (); 43 #pragma omp atomic capture 44 { v = x; x = 3 + x; } 45 if (v != 6) 46 abort (); 47 #pragma omp atomic capture 48 { v = x; x = -1 * -1 * -1 * -1 - x; } 49 if (v != 9) 50 abort (); 51 #pragma omp atomic read 52 v = x; 53 if (v != -8) 54 abort (); 55 #pragma omp atomic capture 56 { x = 2 * 2 - x; v = x; } 57 if (v != 12) 58 abort (); 59 #pragma omp atomic capture 60 { x = 7 & x; v = x; } 61 if (v != 4) 62 abort (); 63 #pragma omp atomic capture 64 { v = x; x = 6; } 65 if (v != 4) 66 abort (); 67 #pragma omp atomic read 68 v = x; 69 if (v != 6) 70 abort (); 71 #pragma omp atomic capture 72 { v = x; x = 7 * 8 + 23; } 73 if (v != 6) 74 abort (); 75 #pragma omp atomic read 76 v = x; 77 if (v != 79) 78 abort (); 79 #pragma omp atomic capture 80 { v = x; x = 23 + 6 * 4; } 81 if (v != 79) 82 abort (); 83 #pragma omp atomic read 84 v = x; 85 if (v != 47) 86 abort (); 87 #pragma omp atomic capture 88 { v = x; x = l ? 17 : 12; } 89 if (v != 47) 90 abort (); 91 #pragma omp atomic capture 92 { v = x; x = l = s++ + 3; } 93 if (v != 17 || l != 4 || s != 2) 94 abort (); 95 #pragma omp atomic read 96 v = x; 97 if (v != 4) 98 abort (); 99} 100 101int x = 6; 102 103int 104main () 105{ 106 foo <int> (); 107 return 0; 108} 109