123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- // { dg-do run }
- extern "C" void abort ();
- int cnt;
- int
- foo ()
- {
- return cnt++;
- }
- template <typename T>
- void
- bar ()
- {
- extern T x;
- T v, *p;
- #pragma omp atomic update
- x = x + 7;
- #pragma omp atomic
- x = x + 7 + 6;
- #pragma omp atomic update
- x = x + 2 * 3;
- #pragma omp atomic
- x = x * (2 - 1);
- #pragma omp atomic read
- v = x;
- if (v != 32)
- abort ();
- #pragma omp atomic write
- x = 0;
- #pragma omp atomic capture
- {
- v = x;
- x = x | 1 ^ 2;
- }
- if (v != 0)
- abort ();
- #pragma omp atomic capture
- {
- v = x;
- x = x | 4 | 2;
- }
- if (v != 3)
- abort ();
- #pragma omp atomic read
- v = x;
- if (v != 7)
- abort ();
- #pragma omp atomic capture
- {
- x = x ^ 6 & 2;
- v = x;
- }
- if (v != 5)
- abort ();
- #pragma omp atomic capture
- { x = x - (6 + 4); v = x; }
- if (v != -5)
- abort ();
- #pragma omp atomic capture
- { v = x; x = x - (1 | 2); }
- if (v != -5)
- abort ();
- #pragma omp atomic read
- v = x;
- if (v != -8)
- abort ();
- #pragma omp atomic
- x = x * -4 / 2;
- #pragma omp atomic read
- v = x;
- if (v != 16)
- abort ();
- p = &x;
- #pragma omp atomic update
- p[foo (), 0] = p[foo (), 0] - 16;
- #pragma omp atomic read
- v = x;
- if (cnt != 2 || v != 0)
- abort ();
- #pragma omp atomic capture
- {
- p[foo (), 0] += 6;
- v = p[foo (), 0];
- }
- if (cnt != 4 || v != 6)
- abort ();
- #pragma omp atomic capture
- {
- v = p[foo (), 0];
- p[foo (), 0] += 6;
- }
- if (cnt != 6 || v != 6)
- abort ();
- #pragma omp atomic read
- v = x;
- if (v != 12)
- abort ();
- #pragma omp atomic capture
- {
- p[foo (), 0] = p[foo (), 0] + 6;
- v = p[foo (), 0];
- }
- if (cnt != 9 || v != 18)
- abort ();
- #pragma omp atomic capture
- {
- v = p[foo (), 0];
- p[foo (), 0] = p[foo (), 0] + 6;
- }
- if (cnt != 12 || v != 18)
- abort ();
- #pragma omp atomic read
- v = x;
- if (v != 24)
- abort ();
- #pragma omp atomic capture
- { v = p[foo (), 0]; p[foo (), 0]++; }
- #pragma omp atomic capture
- { v = p[foo (), 0]; ++p[foo (), 0]; }
- #pragma omp atomic capture
- { p[foo (), 0]++; v = p[foo (), 0]; }
- #pragma omp atomic capture
- { ++p[foo (), 0]; v = p[foo (), 0]; }
- if (cnt != 20 || v != 28)
- abort ();
- #pragma omp atomic capture
- { v = p[foo (), 0]; p[foo (), 0]--; }
- #pragma omp atomic capture
- { v = p[foo (), 0]; --p[foo (), 0]; }
- #pragma omp atomic capture
- { p[foo (), 0]--; v = p[foo (), 0]; }
- #pragma omp atomic capture
- { --p[foo (), 0]; v = p[foo (), 0]; }
- if (cnt != 28 || v != 24)
- abort ();
- }
- int x = 6;
- int
- main ()
- {
- bar <int> ();
- return 0;
- }
|