1// { dg-do run } 2 3extern "C" void abort (); 4int cnt; 5 6int 7foo () 8{ 9 return cnt++; 10} 11 12template <typename T> 13void 14bar () 15{ 16 extern T x; 17 T v, *p; 18 p = &x; 19 #pragma omp atomic update 20 p[foo (), 0] = 16 + 6 - p[foo (), 0]; 21 #pragma omp atomic read 22 v = x; 23 if (cnt != 2 || v != 16) 24 abort (); 25 #pragma omp atomic capture 26 v = p[foo () + foo (), 0] = p[foo () + foo (), 0] + 3; 27 if (cnt != 6 || v != 19) 28 abort (); 29 #pragma omp atomic capture 30 v = p[foo (), 0] = 12 * 1 / 2 + (foo (), 0) + p[foo (), 0]; 31 if (cnt != 9 || v != 25) 32 abort (); 33 #pragma omp atomic capture 34 { 35 v = p[foo () & 0]; p[foo () & 0] = (foo (), 1) * 9 - p[foo () & 0]; 36 } 37 if (cnt != 13 || v != 25) 38 abort (); 39 #pragma omp atomic read 40 v = x; 41 if (v != -16) 42 abort (); 43 #pragma omp atomic capture 44 { 45 p[0 & foo ()] = 16 - 2 + 3 + p[0 & foo ()]; v = p[0 & foo ()]; 46 } 47 if (cnt != 16 || v != 1) 48 abort (); 49 #pragma omp atomic capture 50 { 51 v = p[foo (), 0]; p[foo (), 0] = (foo (), 7) ? 13 : foo () + 6; 52 } 53 if (cnt != 19 || v != 1) 54 abort (); 55 #pragma omp atomic read 56 v = x; 57 if (v != 13) 58 abort (); 59} 60 61int x = 6; 62 63int 64main () 65{ 66 bar <int> (); 67 return 0; 68} 69