1// { dg-do run } 2 3extern "C" void abort (); 4int x = 6, cnt; 5 6int 7foo () 8{ 9 return cnt++; 10} 11 12int 13main () 14{ 15 int v, *p; 16 #pragma omp atomic update 17 x = x + 7; 18 #pragma omp atomic 19 x = x + 7 + 6; 20 #pragma omp atomic update 21 x = x + 2 * 3; 22 #pragma omp atomic 23 x = x * (2 - 1); 24 #pragma omp atomic read 25 v = x; 26 if (v != 32) 27 abort (); 28 #pragma omp atomic write 29 x = 0; 30 #pragma omp atomic capture 31 { 32 v = x; 33 x = x | 1 ^ 2; 34 } 35 if (v != 0) 36 abort (); 37 #pragma omp atomic capture 38 { 39 v = x; 40 x = x | 4 | 2; 41 } 42 if (v != 3) 43 abort (); 44 #pragma omp atomic read 45 v = x; 46 if (v != 7) 47 abort (); 48 #pragma omp atomic capture 49 { 50 x = x ^ 6 & 2; 51 v = x; 52 } 53 if (v != 5) 54 abort (); 55 #pragma omp atomic capture 56 { x = x - (6 + 4); v = x; } 57 if (v != -5) 58 abort (); 59 #pragma omp atomic capture 60 { v = x; x = x - (1 | 2); } 61 if (v != -5) 62 abort (); 63 #pragma omp atomic read 64 v = x; 65 if (v != -8) 66 abort (); 67 #pragma omp atomic 68 x = x * -4 / 2; 69 #pragma omp atomic read 70 v = x; 71 if (v != 16) 72 abort (); 73 p = &x; 74 #pragma omp atomic update 75 p[foo (), 0] = p[foo (), 0] - 16; 76 #pragma omp atomic read 77 v = x; 78 if (cnt != 2 || v != 0) 79 abort (); 80 #pragma omp atomic capture 81 { 82 p[foo (), 0] += 6; 83 v = p[foo (), 0]; 84 } 85 if (cnt != 4 || v != 6) 86 abort (); 87 #pragma omp atomic capture 88 { 89 v = p[foo (), 0]; 90 p[foo (), 0] += 6; 91 } 92 if (cnt != 6 || v != 6) 93 abort (); 94 #pragma omp atomic read 95 v = x; 96 if (v != 12) 97 abort (); 98 #pragma omp atomic capture 99 { 100 p[foo (), 0] = p[foo (), 0] + 6; 101 v = p[foo (), 0]; 102 } 103 if (cnt != 9 || v != 18) 104 abort (); 105 #pragma omp atomic capture 106 { 107 v = p[foo (), 0]; 108 p[foo (), 0] = p[foo (), 0] + 6; 109 } 110 if (cnt != 12 || v != 18) 111 abort (); 112 #pragma omp atomic read 113 v = x; 114 if (v != 24) 115 abort (); 116 #pragma omp atomic capture 117 { v = p[foo (), 0]; p[foo (), 0]++; } 118 #pragma omp atomic capture 119 { v = p[foo (), 0]; ++p[foo (), 0]; } 120 #pragma omp atomic capture 121 { p[foo (), 0]++; v = p[foo (), 0]; } 122 #pragma omp atomic capture 123 { ++p[foo (), 0]; v = p[foo (), 0]; } 124 if (cnt != 20 || v != 28) 125 abort (); 126 #pragma omp atomic capture 127 { v = p[foo (), 0]; p[foo (), 0]--; } 128 #pragma omp atomic capture 129 { v = p[foo (), 0]; --p[foo (), 0]; } 130 #pragma omp atomic capture 131 { p[foo (), 0]--; v = p[foo (), 0]; } 132 #pragma omp atomic capture 133 { --p[foo (), 0]; v = p[foo (), 0]; } 134 if (cnt != 28 || v != 24) 135 abort (); 136 return 0; 137} 138