blob: ece1bf3f02905a781ac22976ee1703c57693f6c2 [file] [log] [blame]
// { 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;
}