blob: 9b7fbaa9912c7f65eb5b3bd434f5b07946933865 [file] [log] [blame]
// { dg-do run }
extern "C" void abort ();
int x = 6, cnt;
int
foo ()
{
return cnt++;
}
int
main ()
{
int 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 ();
return 0;
}